diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItem.java b/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItem.java
index 7e225026e..6d6290716 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItem.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItem.java
@@ -1,8 +1,9 @@
package org.schabi.newpipe.extractor.comments;
import org.schabi.newpipe.extractor.InfoItem;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
-import java.util.Calendar;
+import javax.annotation.Nullable;
public class CommentsInfoItem extends InfoItem {
@@ -12,7 +13,7 @@ public class CommentsInfoItem extends InfoItem {
private String authorThumbnail;
private String authorEndpoint;
private String textualPublishedTime;
- private Calendar publishedTime;
+ @Nullable private DateWrapper publishedTime;
private int likeCount;
public CommentsInfoItem(int serviceId, String url, String name) {
@@ -67,11 +68,12 @@ public class CommentsInfoItem extends InfoItem {
this.textualPublishedTime = textualPublishedTime;
}
- public Calendar getPublishedTime() {
+ @Nullable
+ public DateWrapper getPublishedTime() {
return publishedTime;
}
- public void setPublishedTime(Calendar publishedTime) {
+ public void setPublishedTime(@Nullable DateWrapper publishedTime) {
this.publishedTime = publishedTime;
}
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemExtractor.java
index 4560f0441..7b40f8fa6 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemExtractor.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemExtractor.java
@@ -2,8 +2,9 @@ package org.schabi.newpipe.extractor.comments;
import org.schabi.newpipe.extractor.InfoItemExtractor;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
-import java.util.Calendar;
+import javax.annotation.Nullable;
public interface CommentsInfoItemExtractor extends InfoItemExtractor {
String getCommentId() throws ParsingException;
@@ -12,6 +13,7 @@ public interface CommentsInfoItemExtractor extends InfoItemExtractor {
String getAuthorThumbnail() throws ParsingException;
String getAuthorEndpoint() throws ParsingException;
String getTextualPublishedTime() throws ParsingException;
- Calendar getPublishedTime() throws ParsingException;
+ @Nullable
+ DateWrapper getPublishedTime() throws ParsingException;
int getLikeCount() throws ParsingException;
}
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/localization/DateWrapper.java b/extractor/src/main/java/org/schabi/newpipe/extractor/localization/DateWrapper.java
new file mode 100644
index 000000000..433287852
--- /dev/null
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/localization/DateWrapper.java
@@ -0,0 +1,39 @@
+package org.schabi.newpipe.extractor.localization;
+
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+import java.io.Serializable;
+import java.util.Calendar;
+
+/**
+ * A wrapper class that provides a field to describe if the date is precise or just an approximation.
+ */
+public class DateWrapper implements Serializable {
+ @NonNull private final Calendar date;
+ private final boolean isApproximation;
+
+ public DateWrapper(@NonNull Calendar date) {
+ this(date, false);
+ }
+
+ public DateWrapper(@NonNull Calendar date, boolean isApproximation) {
+ this.date = date;
+ this.isApproximation = isApproximation;
+ }
+
+ /**
+ * @return the wrapped date.
+ */
+ @NonNull
+ public Calendar date() {
+ return date;
+ }
+
+ /**
+ * @return if the date is considered is precise or just an approximation (e.g. service only returns an approximation
+ * like 2 weeks ago instead of a precise date).
+ */
+ public boolean isApproximation() {
+ return isApproximation;
+ }
+}
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/localization/TimeAgoParser.java b/extractor/src/main/java/org/schabi/newpipe/extractor/localization/TimeAgoParser.java
index 3d2e99237..aae9b14c4 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/localization/TimeAgoParser.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/localization/TimeAgoParser.java
@@ -31,15 +31,16 @@ public class TimeAgoParser {
}
/**
- * Parses a textual date in the format '2 days ago' into a Calendar representation.
- * Beginning with weeks ago, marks the date as approximated by setting minutes, seconds
- * and milliseconds to 0.
+ * Parses a textual date in the format '2 days ago' into a Calendar representation which is then wrapped in a
+ * {@link DateWrapper} object.
+ *
+ * Beginning with days ago, the date is considered as an approximation.
*
* @param textualDate The original date as provided by the streaming service
- * @return The parsed (approximated) time
+ * @return The parsed time (can be approximated)
* @throws ParsingException if the time unit could not be recognized
*/
- public Calendar parse(String textualDate) throws ParsingException {
+ public DateWrapper parse(String textualDate) throws ParsingException {
for (Map.Entry> caseUnitEntry : patternsHolder.specialCases().entrySet()) {
final TimeAgoUnit timeAgoUnit = caseUnitEntry.getKey();
for (Map.Entry caseMapToAmountEntry : caseUnitEntry.getValue().entrySet()) {
@@ -47,7 +48,7 @@ public class TimeAgoParser {
final Integer caseAmount = caseMapToAmountEntry.getValue();
if (textualDateMatches(textualDate, caseText)) {
- return getCalendar(caseAmount, timeAgoUnit);
+ return getResultFor(caseAmount, timeAgoUnit);
}
}
}
@@ -61,8 +62,8 @@ public class TimeAgoParser {
timeAgoAmount = 1;
}
- TimeAgoUnit timeAgoUnit = parseTimeAgoUnit(textualDate);
- return getCalendar(timeAgoAmount, timeAgoUnit);
+ final TimeAgoUnit timeAgoUnit = parseTimeAgoUnit(textualDate);
+ return getResultFor(timeAgoAmount, timeAgoUnit);
}
private int parseTimeAgoAmount(String textualDate) throws NumberFormatException {
@@ -110,8 +111,9 @@ public class TimeAgoParser {
}
}
- private Calendar getCalendar(int timeAgoAmount, TimeAgoUnit timeAgoUnit) {
- Calendar calendarTime = getNow();
+ private DateWrapper getResultFor(int timeAgoAmount, TimeAgoUnit timeAgoUnit) {
+ final Calendar calendarTime = getNow();
+ boolean isApproximation = false;
switch (timeAgoUnit) {
case SECONDS:
@@ -128,28 +130,32 @@ public class TimeAgoParser {
case DAYS:
calendarTime.add(Calendar.DAY_OF_MONTH, -timeAgoAmount);
- markApproximatedTime(calendarTime);
+ isApproximation = true;
break;
case WEEKS:
calendarTime.add(Calendar.WEEK_OF_YEAR, -timeAgoAmount);
- markApproximatedTime(calendarTime);
+ isApproximation = true;
break;
case MONTHS:
calendarTime.add(Calendar.MONTH, -timeAgoAmount);
- markApproximatedTime(calendarTime);
+ isApproximation = true;
break;
case YEARS:
calendarTime.add(Calendar.YEAR, -timeAgoAmount);
// Prevent `PrettyTime` from showing '12 months ago'.
calendarTime.add(Calendar.DAY_OF_MONTH, -1);
- markApproximatedTime(calendarTime);
+ isApproximation = true;
break;
}
- return calendarTime;
+ if (isApproximation) {
+ markApproximatedTime(calendarTime);
+ }
+
+ return new DateWrapper(calendarTime, isApproximation);
}
private Calendar getNow() {
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCStreamExtractor.java
index 16e5e0d52..a1dfd2454 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCStreamExtractor.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCStreamExtractor.java
@@ -10,15 +10,12 @@ import org.schabi.newpipe.extractor.downloader.Downloader;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.linkhandler.LinkHandler;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.stream.*;
import javax.annotation.Nonnull;
import java.io.IOException;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
import java.util.List;
public class MediaCCCStreamExtractor extends StreamExtractor {
@@ -38,8 +35,8 @@ public class MediaCCCStreamExtractor extends StreamExtractor {
@Nonnull
@Override
- public Calendar getUploadDate() throws ParsingException {
- return MediaCCCParsingHelper.parseDateFrom(getTextualUploadDate());
+ public DateWrapper getUploadDate() throws ParsingException {
+ return new DateWrapper(MediaCCCParsingHelper.parseDateFrom(getTextualUploadDate()));
}
@Nonnull
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/infoItems/MediaCCCStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/infoItems/MediaCCCStreamInfoItemExtractor.java
index 085c115b8..76347b39b 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/infoItems/MediaCCCStreamInfoItemExtractor.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/infoItems/MediaCCCStreamInfoItemExtractor.java
@@ -2,11 +2,12 @@ package org.schabi.newpipe.extractor.services.media_ccc.extractors.infoItems;
import com.grack.nanojson.JsonObject;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCParsingHelper;
import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor;
import org.schabi.newpipe.extractor.stream.StreamType;
-import java.util.Calendar;
+import javax.annotation.Nullable;
public class MediaCCCStreamInfoItemExtractor implements StreamInfoItemExtractor {
@@ -47,14 +48,16 @@ public class MediaCCCStreamInfoItemExtractor implements StreamInfoItemExtractor
return event.getString("conference_url");
}
+ @Nullable
@Override
public String getTextualUploadDate() throws ParsingException {
return event.getString("release_date");
}
+ @Nullable
@Override
- public Calendar getUploadDate() throws ParsingException {
- return MediaCCCParsingHelper.parseDateFrom(getTextualUploadDate());
+ public DateWrapper getUploadDate() throws ParsingException {
+ return new DateWrapper(MediaCCCParsingHelper.parseDateFrom(getTextualUploadDate()));
}
@Override
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java
index 0fa636e7f..c9c44c991 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java
@@ -9,15 +9,14 @@ import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.linkhandler.LinkHandler;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.stream.*;
import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
-import java.util.Calendar;
import java.util.Collections;
import java.util.List;
@@ -58,8 +57,8 @@ public class SoundcloudStreamExtractor extends StreamExtractor {
@Nonnull
@Override
- public Calendar getUploadDate() throws ParsingException {
- return SoundcloudParsingHelper.parseDate(getTextualUploadDate());
+ public DateWrapper getUploadDate() throws ParsingException {
+ return new DateWrapper(SoundcloudParsingHelper.parseDate(getTextualUploadDate()));
}
@Nonnull
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamInfoItemExtractor.java
index 7453c5ada..da0ca1b54 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamInfoItemExtractor.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamInfoItemExtractor.java
@@ -2,11 +2,10 @@ package org.schabi.newpipe.extractor.services.soundcloud;
import com.grack.nanojson.JsonObject;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor;
import org.schabi.newpipe.extractor.stream.StreamType;
-import java.util.Calendar;
-
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtractor {
@@ -48,8 +47,8 @@ public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtracto
}
@Override
- public Calendar getUploadDate() throws ParsingException {
- return SoundcloudParsingHelper.parseDate(getTextualUploadDate());
+ public DateWrapper getUploadDate() throws ParsingException {
+ return new DateWrapper(SoundcloudParsingHelper.parseDate(getTextualUploadDate()));
}
private String getCreatedAt() {
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeCommentsInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeCommentsInfoItemExtractor.java
index f3e6df2a4..3fa0e388e 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeCommentsInfoItemExtractor.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeCommentsInfoItemExtractor.java
@@ -5,10 +5,11 @@ import com.grack.nanojson.JsonObject;
import org.schabi.newpipe.extractor.comments.CommentsInfoItemExtractor;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.utils.JsonUtils;
import org.schabi.newpipe.extractor.utils.Utils;
-import java.util.Calendar;
+import javax.annotation.Nullable;
public class YoutubeCommentsInfoItemExtractor implements CommentsInfoItemExtractor {
@@ -55,8 +56,9 @@ public class YoutubeCommentsInfoItemExtractor implements CommentsInfoItemExtract
}
}
+ @Nullable
@Override
- public Calendar getPublishedTime() throws ParsingException {
+ public DateWrapper getPublishedTime() throws ParsingException {
String textualPublishedTime = getTextualPublishedTime();
if (timeAgoParser != null && textualPublishedTime != null && !textualPublishedTime.isEmpty()) {
return timeAgoParser.parse(textualPublishedTime);
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java
index 7bafff098..671db465d 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java
@@ -23,6 +23,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
import org.schabi.newpipe.extractor.linkhandler.LinkHandler;
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.services.youtube.ItagItem;
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeParsingHelper;
import org.schabi.newpipe.extractor.stream.*;
@@ -134,14 +135,14 @@ public class YoutubeStreamExtractor extends StreamExtractor {
}
@Override
- public Calendar getUploadDate() throws ParsingException {
+ public DateWrapper getUploadDate() throws ParsingException {
final String textualUploadDate = getTextualUploadDate();
if (textualUploadDate == null) {
return null;
}
- return YoutubeParsingHelper.parseDateFrom(textualUploadDate);
+ return new DateWrapper(YoutubeParsingHelper.parseDateFrom(textualUploadDate));
}
@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 98a484d3a..514b4fb0a 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
@@ -4,6 +4,7 @@ import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeParsingHelper;
import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor;
import org.schabi.newpipe.extractor.stream.StreamType;
@@ -141,6 +142,7 @@ public class YoutubeStreamInfoItemExtractor implements StreamInfoItemExtractor {
}
}
+ @Nullable
@Override
public String getTextualUploadDate() throws ParsingException {
if (getStreamType().equals(StreamType.LIVE_STREAM)) {
@@ -173,17 +175,15 @@ public class YoutubeStreamInfoItemExtractor implements StreamInfoItemExtractor {
}
}
+ @Nullable
@Override
- public Calendar getUploadDate() throws ParsingException {
+ public DateWrapper getUploadDate() throws ParsingException {
if (getStreamType().equals(StreamType.LIVE_STREAM)) {
return null;
}
if (isVideoReminder()) {
- final Calendar calendar = getDateFromReminder();
- if (calendar != null) {
- return calendar;
- }
+ return new DateWrapper(getDateFromReminder());
}
String textualUploadDate = getTextualUploadDate();
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamExtractor.java
index 7957de2a5..d697dff2c 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamExtractor.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamExtractor.java
@@ -26,13 +26,12 @@ import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.linkhandler.LinkHandler;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.utils.Parser;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Calendar;
import java.util.Collections;
import java.util.List;
@@ -72,7 +71,7 @@ public abstract class StreamExtractor extends Extractor {
* @see #getTextualUploadDate()
*/
@Nullable
- public abstract Calendar getUploadDate() throws ParsingException;
+ public abstract DateWrapper getUploadDate() throws ParsingException;
/**
* This will return the url to the thumbnail of the stream. Try to return the medium resolution here.
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java
index 8a049faa0..34ea703c2 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java
@@ -1,19 +1,19 @@
package org.schabi.newpipe.extractor.stream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
-
import org.schabi.newpipe.extractor.Info;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.utils.DashMpdParser;
import org.schabi.newpipe.extractor.utils.ExtractorHelper;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
/*
* Created by Christian Schabesberger on 26.08.15.
*
@@ -278,7 +278,7 @@ public class StreamInfo extends Info {
private StreamType streamType;
private String thumbnailUrl = "";
private String textualUploadDate;
- private Calendar uploadDate;
+ private DateWrapper uploadDate;
private long duration = -1;
private int ageLimit = -1;
private String description;
@@ -342,11 +342,11 @@ public class StreamInfo extends Info {
this.textualUploadDate = textualUploadDate;
}
- public Calendar getUploadDate() {
+ public DateWrapper getUploadDate() {
return uploadDate;
}
- public void setUploadDate(Calendar uploadDate) {
+ public void setUploadDate(DateWrapper uploadDate) {
this.uploadDate = uploadDate;
}
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItem.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItem.java
index 202188a79..6623c1efe 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItem.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItem.java
@@ -21,9 +21,9 @@ package org.schabi.newpipe.extractor.stream;
*/
import org.schabi.newpipe.extractor.InfoItem;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import javax.annotation.Nullable;
-import java.util.Calendar;
/**
* Info object for previews of unopened videos, eg search results, related videos
@@ -33,7 +33,7 @@ public class StreamInfoItem extends InfoItem {
private String uploaderName;
private String textualUploadDate;
- private Calendar uploadDate;
+ @Nullable private DateWrapper uploadDate;
private long viewCount = -1;
private long duration = -1;
@@ -80,10 +80,6 @@ public class StreamInfoItem extends InfoItem {
this.uploaderUrl = uploaderUrl;
}
- /**
- * @return The original textual upload date as returned by the streaming service.
- * @see #getUploadDate()
- */
@Nullable
public String getTextualUploadDate() {
return textualUploadDate;
@@ -93,16 +89,12 @@ public class StreamInfoItem extends InfoItem {
this.textualUploadDate = uploadDate;
}
- /**
- * @return The (approximated) date and time this item was uploaded or {@code null}.
- * @see #getTextualUploadDate()
- */
@Nullable
- public Calendar getUploadDate() {
+ public DateWrapper getUploadDate() {
return uploadDate;
}
- public void setUploadDate(Calendar uploadDate) {
+ public void setUploadDate(@Nullable DateWrapper uploadDate) {
this.uploadDate = uploadDate;
}
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemExtractor.java
index 154e74651..113f3a87f 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemExtractor.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemExtractor.java
@@ -2,8 +2,9 @@ package org.schabi.newpipe.extractor.stream;
import org.schabi.newpipe.extractor.InfoItemExtractor;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
-import java.util.Calendar;
+import javax.annotation.Nullable;
/*
* Created by Christian Schabesberger on 28.02.16.
@@ -69,26 +70,27 @@ public interface StreamInfoItemExtractor extends InfoItemExtractor {
* The original textual date provided by the service. Should be used as a fallback if
* {@link #getUploadDate()} isn't provided by the service, or it fails for some reason.
*
- * @return The original textual date provided by the service.
+ * @return The original textual date provided by the service or {@code null} if not provided.
* @throws ParsingException if there is an error in the extraction
* @see #getUploadDate()
*/
+ @Nullable
String getTextualUploadDate() throws ParsingException;
/**
* Extracts the upload date and time of this item and parses it.
*
* If the service doesn't provide an exact time, an approximation can be returned.
- * The approximation should be marked by setting seconds and milliseconds to zero.
*
* If the service doesn't provide any date at all, then {@code null} should be returned.
*
*
- * @return The (approximated) date and time this item was uploaded or {@code null}.
+ * @return The date and time (can be approximated) this item was uploaded or {@code null}.
* @throws ParsingException if there is an error in the extraction
* or the extracted date couldn't be parsed.
* @see #getTextualUploadDate()
*/
- Calendar getUploadDate() throws ParsingException;
+ @Nullable
+ DateWrapper getUploadDate() throws ParsingException;
}
diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/DefaultTests.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/DefaultTests.java
index 3b839fd89..8cf27094a 100644
--- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/DefaultTests.java
+++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/DefaultTests.java
@@ -2,6 +2,7 @@ package org.schabi.newpipe.extractor.services;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.ListExtractor;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import java.util.Calendar;
@@ -31,9 +32,9 @@ public final class DefaultTests {
final String textualUploadDate = streamInfoItem.getTextualUploadDate();
if (textualUploadDate != null && !textualUploadDate.isEmpty()) {
- final Calendar uploadDate = streamInfoItem.getUploadDate();
+ final DateWrapper uploadDate = streamInfoItem.getUploadDate();
assertNotNull("No parsed upload date", uploadDate);
- assertTrue("Upload date not in the past", uploadDate.before(Calendar.getInstance()));
+ assertTrue("Upload date not in the past", uploadDate.date().before(Calendar.getInstance()));
}
}
diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCStreamExtractorTest.java
index 9aa1ef025..befd840f4 100644
--- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCStreamExtractorTest.java
+++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCStreamExtractorTest.java
@@ -14,6 +14,7 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
+import static java.util.Objects.requireNonNull;
import static junit.framework.TestCase.assertEquals;
import static org.schabi.newpipe.extractor.ServiceList.MediaCCC;
@@ -95,6 +96,6 @@ public class MediaCCCStreamExtractorTest implements BaseExtractorTest {
public void testGetUploadDate() throws ParsingException, ParseException {
final Calendar instance = Calendar.getInstance();
instance.setTime(new SimpleDateFormat("yyyy-MM-dd").parse("2018-05-11"));
- Assert.assertEquals(instance, extractor.getUploadDate());
+ assertEquals(instance, requireNonNull(extractor.getUploadDate()).date());
}
}
diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractorDefaultTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractorDefaultTest.java
index 9610a43af..8a3883fd6 100644
--- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractorDefaultTest.java
+++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractorDefaultTest.java
@@ -16,6 +16,7 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
+import static java.util.Objects.requireNonNull;
import static org.junit.Assert.*;
import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl;
import static org.schabi.newpipe.extractor.ServiceList.SoundCloud;
@@ -80,7 +81,7 @@ public class SoundcloudStreamExtractorDefaultTest {
public void testGetUploadDate() throws ParsingException, ParseException {
final Calendar instance = Calendar.getInstance();
instance.setTime(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss +0000").parse("2016/07/31 18:18:07 +0000"));
- Assert.assertEquals(instance, extractor.getUploadDate());
+ assertEquals(instance, requireNonNull(extractor.getUploadDate()).date());
}
@Test
diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLocalizationTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLocalizationTest.java
index 731225af2..29f3d0323 100644
--- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLocalizationTest.java
+++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLocalizationTest.java
@@ -7,6 +7,7 @@ import org.schabi.newpipe.extractor.ListExtractor;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
import org.schabi.newpipe.extractor.localization.Localization;
+import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import java.text.SimpleDateFormat;
@@ -61,9 +62,9 @@ public class YoutubeChannelLocalizationTest {
String debugMessage = "[" + String.format("%02d", i) + "] "
+ currentLocalization.getLocalizationCode() + " → " + item.getName()
+ "\n:::: " + item.getStreamType() + ", views = " + item.getViewCount();
- final Calendar uploadDate = item.getUploadDate();
+ final DateWrapper uploadDate = item.getUploadDate();
if (uploadDate != null) {
- String dateAsText = dateFormat.format(uploadDate.getTime());
+ String dateAsText = dateFormat.format(uploadDate.date().getTime());
debugMessage += "\n:::: " + item.getTextualUploadDate() +
"\n:::: " + dateAsText;
}
@@ -102,17 +103,17 @@ public class YoutubeChannelLocalizationTest {
final StreamInfoItem referenceItem = referenceList.get(i);
final StreamInfoItem currentItem = currentList.get(i);
- final Calendar referenceUploadDate = referenceItem.getUploadDate();
- final Calendar currentUploadDate = currentItem.getUploadDate();
+ final DateWrapper referenceUploadDate = referenceItem.getUploadDate();
+ final DateWrapper currentUploadDate = currentItem.getUploadDate();
final String referenceDateString = referenceUploadDate == null ? "null" :
- dateFormat.format(referenceUploadDate.getTime());
+ dateFormat.format(referenceUploadDate.date().getTime());
final String currentDateString = currentUploadDate == null ? "null" :
- dateFormat.format(currentUploadDate.getTime());
+ dateFormat.format(currentUploadDate.date().getTime());
long difference = -1;
if (referenceUploadDate != null && currentUploadDate != null) {
- difference = Math.abs(referenceUploadDate.getTimeInMillis() - currentUploadDate.getTimeInMillis());
+ difference = Math.abs(referenceUploadDate.date().getTimeInMillis() - currentUploadDate.date().getTimeInMillis());
}
final boolean areTimeEquals = difference < 5 * 60 * 1000L;
diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorAgeRestrictedTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorAgeRestrictedTest.java
index c626651aa..992a8cd92 100644
--- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorAgeRestrictedTest.java
+++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorAgeRestrictedTest.java
@@ -1,7 +1,6 @@
package org.schabi.newpipe.extractor.services.youtube.stream;
import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Test;
import org.schabi.newpipe.DownloaderTestImpl;
import org.schabi.newpipe.extractor.MediaFormat;
@@ -18,9 +17,9 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
-import java.util.Date;
import java.util.List;
+import static java.util.Objects.requireNonNull;
import static org.junit.Assert.*;
import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl;
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
@@ -93,7 +92,7 @@ public class YoutubeStreamExtractorAgeRestrictedTest {
public void testGetUploadDate() throws ParsingException, ParseException {
final Calendar instance = Calendar.getInstance();
instance.setTime(new SimpleDateFormat("yyyy-MM-dd").parse("2017-01-25"));
- assertEquals(instance, extractor.getUploadDate());
+ assertEquals(instance, requireNonNull(extractor.getUploadDate()).date());
}
@Test
diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorControversialTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorControversialTest.java
index 214f6beca..7faec8051 100644
--- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorControversialTest.java
+++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorControversialTest.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
+import static java.util.Objects.requireNonNull;
import static org.junit.Assert.*;
import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl;
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
@@ -92,7 +93,7 @@ public class YoutubeStreamExtractorControversialTest {
public void testGetUploadDate() throws ParsingException, ParseException {
final Calendar instance = Calendar.getInstance();
instance.setTime(new SimpleDateFormat("yyyy-MM-dd").parse("2010-09-09"));
- assertEquals(instance, extractor.getUploadDate());
+ assertEquals(instance, requireNonNull(extractor.getUploadDate()).date());
}
@Test
diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorDefaultTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorDefaultTest.java
index 27638efe9..e715144a9 100644
--- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorDefaultTest.java
+++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorDefaultTest.java
@@ -17,9 +17,9 @@ import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
-import java.util.Date;
import java.util.List;
+import static java.util.Objects.*;
import static org.junit.Assert.*;
import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl;
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
@@ -119,7 +119,7 @@ public class YoutubeStreamExtractorDefaultTest {
public void testGetUploadDate() throws ParsingException, ParseException {
final Calendar instance = Calendar.getInstance();
instance.setTime(new SimpleDateFormat("yyyy-MM-dd").parse("2015-10-22"));
- Assert.assertEquals(instance, extractor.getUploadDate());
+ assertEquals(instance, requireNonNull(extractor.getUploadDate()).date());
}
@Test