mirror of
https://github.com/TeamNewPipe/NewPipeExtractor.git
synced 2024-12-14 22:30:33 +05:30
Switch from Calendar to OffsetDateTime in DateWrapper.
This commit is contained in:
parent
ee3af63c04
commit
4f04cfccca
@ -3,30 +3,61 @@ package org.schabi.newpipe.extractor.localization;
|
|||||||
import edu.umd.cs.findbugs.annotations.NonNull;
|
import edu.umd.cs.findbugs.annotations.NonNull;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
import java.time.ZoneOffset;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A wrapper class that provides a field to describe if the date is precise or just an approximation.
|
* A wrapper class that provides a field to describe if the date/time is precise or just an approximation.
|
||||||
*/
|
*/
|
||||||
public class DateWrapper implements Serializable {
|
public class DateWrapper implements Serializable {
|
||||||
@NonNull private final Calendar date;
|
@NonNull private final OffsetDateTime offsetDateTime;
|
||||||
private final boolean isApproximation;
|
private final boolean isApproximation;
|
||||||
|
|
||||||
public DateWrapper(@NonNull Calendar date) {
|
/**
|
||||||
this(date, false);
|
* @deprecated Use {@link #DateWrapper(OffsetDateTime)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public DateWrapper(@NonNull Calendar calendar) {
|
||||||
|
this(calendar, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DateWrapper(@NonNull Calendar date, boolean isApproximation) {
|
/**
|
||||||
this.date = date;
|
* @deprecated Use {@link #DateWrapper(OffsetDateTime, boolean)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public DateWrapper(@NonNull Calendar calendar, boolean isApproximation) {
|
||||||
|
offsetDateTime = OffsetDateTime.ofInstant(calendar.toInstant(), ZoneOffset.UTC);
|
||||||
|
this.isApproximation = isApproximation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateWrapper(@NonNull OffsetDateTime offsetDateTime) {
|
||||||
|
this(offsetDateTime, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateWrapper(@NonNull OffsetDateTime offsetDateTime, boolean isApproximation) {
|
||||||
|
this.offsetDateTime = offsetDateTime.withOffsetSameInstant(ZoneOffset.UTC);
|
||||||
this.isApproximation = isApproximation;
|
this.isApproximation = isApproximation;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the wrapped date.
|
* @return the wrapped date/time as a {@link Calendar}.
|
||||||
|
*
|
||||||
|
* @deprecated use {@link #offsetDateTime()} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@NonNull
|
@NonNull
|
||||||
public Calendar date() {
|
public Calendar date() {
|
||||||
return date;
|
return GregorianCalendar.from(offsetDateTime.toZonedDateTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the wrapped date/time.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public OffsetDateTime offsetDateTime() {
|
||||||
|
return offsetDateTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -4,8 +4,9 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
|||||||
import org.schabi.newpipe.extractor.timeago.PatternsHolder;
|
import org.schabi.newpipe.extractor.timeago.PatternsHolder;
|
||||||
import org.schabi.newpipe.extractor.utils.Parser;
|
import org.schabi.newpipe.extractor.utils.Parser;
|
||||||
|
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
import java.time.ZoneOffset;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -16,7 +17,7 @@ import java.util.regex.Pattern;
|
|||||||
*/
|
*/
|
||||||
public class TimeAgoParser {
|
public class TimeAgoParser {
|
||||||
private final PatternsHolder patternsHolder;
|
private final PatternsHolder patternsHolder;
|
||||||
private final Calendar consistentNow;
|
private final OffsetDateTime now;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a helper to parse upload dates in the format '2 days ago'.
|
* Creates a helper to parse upload dates in the format '2 days ago'.
|
||||||
@ -28,7 +29,7 @@ public class TimeAgoParser {
|
|||||||
*/
|
*/
|
||||||
public TimeAgoParser(PatternsHolder patternsHolder) {
|
public TimeAgoParser(PatternsHolder patternsHolder) {
|
||||||
this.patternsHolder = patternsHolder;
|
this.patternsHolder = patternsHolder;
|
||||||
consistentNow = Calendar.getInstance();
|
now = OffsetDateTime.now(ZoneOffset.UTC);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -113,64 +114,34 @@ public class TimeAgoParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private DateWrapper getResultFor(int timeAgoAmount, ChronoUnit chronoUnit) {
|
private DateWrapper getResultFor(int timeAgoAmount, ChronoUnit chronoUnit) {
|
||||||
final Calendar calendarTime = getNow();
|
OffsetDateTime offsetDateTime = now;
|
||||||
boolean isApproximation = false;
|
boolean isApproximation = false;
|
||||||
|
|
||||||
switch (chronoUnit) {
|
switch (chronoUnit) {
|
||||||
case SECONDS:
|
case SECONDS:
|
||||||
calendarTime.add(Calendar.SECOND, -timeAgoAmount);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MINUTES:
|
case MINUTES:
|
||||||
calendarTime.add(Calendar.MINUTE, -timeAgoAmount);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HOURS:
|
case HOURS:
|
||||||
calendarTime.add(Calendar.HOUR_OF_DAY, -timeAgoAmount);
|
offsetDateTime = offsetDateTime.minus(timeAgoAmount, chronoUnit);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DAYS:
|
case DAYS:
|
||||||
calendarTime.add(Calendar.DAY_OF_MONTH, -timeAgoAmount);
|
|
||||||
isApproximation = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WEEKS:
|
case WEEKS:
|
||||||
calendarTime.add(Calendar.WEEK_OF_YEAR, -timeAgoAmount);
|
|
||||||
isApproximation = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MONTHS:
|
case MONTHS:
|
||||||
calendarTime.add(Calendar.MONTH, -timeAgoAmount);
|
offsetDateTime = offsetDateTime.minus(timeAgoAmount, chronoUnit);
|
||||||
isApproximation = true;
|
isApproximation = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case YEARS:
|
case YEARS:
|
||||||
calendarTime.add(Calendar.YEAR, -timeAgoAmount);
|
// minusDays is needed to prevent `PrettyTime` from showing '12 months ago'.
|
||||||
// Prevent `PrettyTime` from showing '12 months ago'.
|
offsetDateTime = offsetDateTime.minusYears(timeAgoAmount).minusDays(1);
|
||||||
calendarTime.add(Calendar.DAY_OF_MONTH, -1);
|
|
||||||
isApproximation = true;
|
isApproximation = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isApproximation) {
|
if (isApproximation) {
|
||||||
markApproximatedTime(calendarTime);
|
offsetDateTime = offsetDateTime.truncatedTo(ChronoUnit.HOURS);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new DateWrapper(calendarTime, isApproximation);
|
return new DateWrapper(offsetDateTime, isApproximation);
|
||||||
}
|
|
||||||
|
|
||||||
private Calendar getNow() {
|
|
||||||
return (Calendar) consistentNow.clone();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Marks the time as approximated by setting minutes, seconds and milliseconds to 0.
|
|
||||||
*
|
|
||||||
* @param calendarTime Time to be marked as approximated
|
|
||||||
*/
|
|
||||||
private void markApproximatedTime(Calendar calendarTime) {
|
|
||||||
calendarTime.set(Calendar.MINUTE, 0);
|
|
||||||
calendarTime.set(Calendar.SECOND, 0);
|
|
||||||
calendarTime.set(Calendar.MILLISECOND, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,28 +2,17 @@ package org.schabi.newpipe.extractor.services.media_ccc.extractors;
|
|||||||
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
|
|
||||||
import java.text.ParseException;
|
import java.time.OffsetDateTime;
|
||||||
import java.text.SimpleDateFormat;
|
import java.time.format.DateTimeParseException;
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
public final class MediaCCCParsingHelper {
|
public final class MediaCCCParsingHelper {
|
||||||
private MediaCCCParsingHelper() { }
|
private MediaCCCParsingHelper() { }
|
||||||
|
|
||||||
public static Calendar parseDateFrom(final String textualUploadDate) throws ParsingException {
|
public static OffsetDateTime parseDateFrom(final String textualUploadDate) throws ParsingException {
|
||||||
final Date date;
|
|
||||||
try {
|
try {
|
||||||
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
return OffsetDateTime.parse(textualUploadDate);
|
||||||
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
|
} catch (DateTimeParseException e) {
|
||||||
date = sdf.parse(textualUploadDate);
|
|
||||||
} catch (ParseException e) {
|
|
||||||
throw new ParsingException("Could not parse date: \"" + textualUploadDate + "\"", e);
|
throw new ParsingException("Could not parse date: \"" + textualUploadDate + "\"", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
final Calendar uploadDate = Calendar.getInstance();
|
|
||||||
uploadDate.setTime(date);
|
|
||||||
return uploadDate;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@ package org.schabi.newpipe.extractor.services.peertube;
|
|||||||
|
|
||||||
import com.grack.nanojson.JsonArray;
|
import com.grack.nanojson.JsonArray;
|
||||||
import com.grack.nanojson.JsonObject;
|
import com.grack.nanojson.JsonObject;
|
||||||
|
|
||||||
import org.schabi.newpipe.extractor.InfoItemsCollector;
|
import org.schabi.newpipe.extractor.InfoItemsCollector;
|
||||||
import org.schabi.newpipe.extractor.Page;
|
import org.schabi.newpipe.extractor.Page;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
||||||
@ -12,11 +11,10 @@ import org.schabi.newpipe.extractor.utils.JsonUtils;
|
|||||||
import org.schabi.newpipe.extractor.utils.Parser;
|
import org.schabi.newpipe.extractor.utils.Parser;
|
||||||
import org.schabi.newpipe.extractor.utils.Utils;
|
import org.schabi.newpipe.extractor.utils.Utils;
|
||||||
|
|
||||||
import java.text.ParseException;
|
import java.time.Instant;
|
||||||
import java.text.SimpleDateFormat;
|
import java.time.OffsetDateTime;
|
||||||
import java.util.Calendar;
|
import java.time.ZoneOffset;
|
||||||
import java.util.Date;
|
import java.time.format.DateTimeParseException;
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
public class PeertubeParsingHelper {
|
public class PeertubeParsingHelper {
|
||||||
public static final String START_KEY = "start";
|
public static final String START_KEY = "start";
|
||||||
@ -34,19 +32,12 @@ public class PeertubeParsingHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Calendar parseDateFrom(final String textualUploadDate) throws ParsingException {
|
public static OffsetDateTime parseDateFrom(final String textualUploadDate) throws ParsingException {
|
||||||
final Date date;
|
|
||||||
try {
|
try {
|
||||||
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S'Z'");
|
return OffsetDateTime.ofInstant(Instant.parse(textualUploadDate), ZoneOffset.UTC);
|
||||||
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
|
} catch (DateTimeParseException e) {
|
||||||
date = sdf.parse(textualUploadDate);
|
|
||||||
} catch (ParseException e) {
|
|
||||||
throw new ParsingException("Could not parse date: \"" + textualUploadDate + "\"", e);
|
throw new ParsingException("Could not parse date: \"" + textualUploadDate + "\"", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
final Calendar uploadDate = Calendar.getInstance();
|
|
||||||
uploadDate.setTime(date);
|
|
||||||
return uploadDate;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Page getNextPage(final String prevPageUrl, final long total) {
|
public static Page getNextPage(final String prevPageUrl, final long total) {
|
||||||
|
@ -21,16 +21,18 @@ import org.schabi.newpipe.extractor.services.soundcloud.extractors.SoundcloudStr
|
|||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
|
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
|
||||||
import org.schabi.newpipe.extractor.utils.Parser;
|
import org.schabi.newpipe.extractor.utils.Parser;
|
||||||
import org.schabi.newpipe.extractor.utils.Parser.RegexException;
|
import org.schabi.newpipe.extractor.utils.Parser.RegexException;
|
||||||
import org.schabi.newpipe.extractor.utils.Utils;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.text.ParseException;
|
import java.time.OffsetDateTime;
|
||||||
import java.text.SimpleDateFormat;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.time.format.DateTimeParseException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static java.util.Collections.singletonList;
|
import static java.util.Collections.singletonList;
|
||||||
import static org.schabi.newpipe.extractor.ServiceList.SoundCloud;
|
import static org.schabi.newpipe.extractor.ServiceList.SoundCloud;
|
||||||
@ -95,23 +97,16 @@ public class SoundcloudParsingHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Calendar parseDateFrom(String textualUploadDate) throws ParsingException {
|
public static OffsetDateTime parseDateFrom(String textualUploadDate) throws ParsingException {
|
||||||
Date date;
|
|
||||||
try {
|
try {
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
|
return OffsetDateTime.parse(textualUploadDate);
|
||||||
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
|
} catch (DateTimeParseException e1) {
|
||||||
date = sdf.parse(textualUploadDate);
|
|
||||||
} catch (ParseException e1) {
|
|
||||||
try {
|
try {
|
||||||
date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss +0000").parse(textualUploadDate);
|
return OffsetDateTime.parse(textualUploadDate, DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss +0000"));
|
||||||
} catch (ParseException e2) {
|
} catch (DateTimeParseException e2) {
|
||||||
throw new ParsingException("Could not parse date: \"" + textualUploadDate + "\"" + ", " + e1.getMessage(), e2);
|
throw new ParsingException("Could not parse date: \"" + textualUploadDate + "\"" + ", " + e1.getMessage(), e2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final Calendar uploadDate = Calendar.getInstance();
|
|
||||||
uploadDate.setTime(date);
|
|
||||||
return uploadDate;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -5,7 +5,6 @@ import com.grack.nanojson.JsonObject;
|
|||||||
import com.grack.nanojson.JsonParser;
|
import com.grack.nanojson.JsonParser;
|
||||||
import com.grack.nanojson.JsonParserException;
|
import com.grack.nanojson.JsonParserException;
|
||||||
import com.grack.nanojson.JsonWriter;
|
import com.grack.nanojson.JsonWriter;
|
||||||
|
|
||||||
import org.jsoup.Jsoup;
|
import org.jsoup.Jsoup;
|
||||||
import org.jsoup.nodes.Document;
|
import org.jsoup.nodes.Document;
|
||||||
import org.schabi.newpipe.extractor.downloader.Response;
|
import org.schabi.newpipe.extractor.downloader.Response;
|
||||||
@ -22,13 +21,18 @@ import java.io.UnsupportedEncodingException;
|
|||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
import java.text.ParseException;
|
import java.time.OffsetDateTime;
|
||||||
import java.text.SimpleDateFormat;
|
import java.time.format.DateTimeParseException;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.schabi.newpipe.extractor.NewPipe.getDownloader;
|
import static org.schabi.newpipe.extractor.NewPipe.getDownloader;
|
||||||
import static org.schabi.newpipe.extractor.utils.JsonUtils.EMPTY_STRING;
|
import static org.schabi.newpipe.extractor.utils.JsonUtils.EMPTY_STRING;
|
||||||
import static org.schabi.newpipe.extractor.utils.Utils.*;
|
import static org.schabi.newpipe.extractor.utils.Utils.HTTP;
|
||||||
|
import static org.schabi.newpipe.extractor.utils.Utils.HTTPS;
|
||||||
|
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Created by Christian Schabesberger on 02.03.16.
|
* Created by Christian Schabesberger on 02.03.16.
|
||||||
@ -176,19 +180,12 @@ public class YoutubeParsingHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Calendar parseDateFrom(String textualUploadDate) throws ParsingException {
|
public static OffsetDateTime parseDateFrom(String textualUploadDate) throws ParsingException {
|
||||||
final Date date;
|
|
||||||
try {
|
try {
|
||||||
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
return OffsetDateTime.parse(textualUploadDate);
|
||||||
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
|
} catch (DateTimeParseException e) {
|
||||||
date = sdf.parse(textualUploadDate);
|
|
||||||
} catch (ParseException e) {
|
|
||||||
throw new ParsingException("Could not parse date: \"" + textualUploadDate + "\"", e);
|
throw new ParsingException("Could not parse date: \"" + textualUploadDate + "\"", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
final Calendar uploadDate = Calendar.getInstance();
|
|
||||||
uploadDate.setTime(date);
|
|
||||||
return uploadDate;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JsonObject getInitialData(String html) throws ParsingException {
|
public static JsonObject getInitialData(String html) throws ParsingException {
|
||||||
|
@ -7,11 +7,9 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor;
|
|||||||
import org.schabi.newpipe.extractor.stream.StreamType;
|
import org.schabi.newpipe.extractor.stream.StreamType;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.text.ParseException;
|
import java.time.OffsetDateTime;
|
||||||
import java.text.SimpleDateFormat;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Calendar;
|
import java.time.format.DateTimeParseException;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
public class YoutubeFeedInfoItemExtractor implements StreamInfoItemExtractor {
|
public class YoutubeFeedInfoItemExtractor implements StreamInfoItemExtractor {
|
||||||
private final Element entryElement;
|
private final Element entryElement;
|
||||||
@ -62,19 +60,11 @@ public class YoutubeFeedInfoItemExtractor implements StreamInfoItemExtractor {
|
|||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public DateWrapper getUploadDate() throws ParsingException {
|
public DateWrapper getUploadDate() throws ParsingException {
|
||||||
final Date date;
|
|
||||||
try {
|
try {
|
||||||
final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+00:00");
|
return new DateWrapper(OffsetDateTime.parse(getTextualUploadDate(), DateTimeFormatter.ISO_OFFSET_DATE_TIME));
|
||||||
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
|
} catch (DateTimeParseException e) {
|
||||||
date = dateFormat.parse(getTextualUploadDate());
|
|
||||||
} catch (ParseException e) {
|
|
||||||
throw new ParsingException("Could not parse date (\"" + getTextualUploadDate() + "\")", e);
|
throw new ParsingException("Could not parse date (\"" + getTextualUploadDate() + "\")", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
final Calendar calendar = Calendar.getInstance();
|
|
||||||
calendar.setTime(date);
|
|
||||||
|
|
||||||
return new DateWrapper(calendar);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -43,11 +43,11 @@ import javax.annotation.Nonnull;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.time.LocalDate;
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -157,23 +157,24 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
|
|
||||||
try { // Premiered 20 hours ago
|
try { // Premiered 20 hours ago
|
||||||
TimeAgoParser timeAgoParser = TimeAgoPatternsManager.getTimeAgoParserFor(Localization.fromLocalizationCode("en"));
|
TimeAgoParser timeAgoParser = TimeAgoPatternsManager.getTimeAgoParserFor(Localization.fromLocalizationCode("en"));
|
||||||
Calendar parsedTime = timeAgoParser.parse(time).date();
|
OffsetDateTime parsedTime = timeAgoParser.parse(time).offsetDateTime();
|
||||||
return new SimpleDateFormat("yyyy-MM-dd").format(parsedTime.getTime());
|
return DateTimeFormatter.ISO_LOCAL_DATE.format(parsedTime);
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
}
|
||||||
|
|
||||||
try { // Premiered Feb 21, 2020
|
try { // Premiered Feb 21, 2020
|
||||||
Date d = new SimpleDateFormat("MMM dd, YYYY", Locale.ENGLISH).parse(time);
|
LocalDate localDate = LocalDate.parse(time,
|
||||||
return new SimpleDateFormat("yyyy-MM-dd").format(d.getTime());
|
DateTimeFormatter.ofPattern("MMM dd, YYYY", Locale.ENGLISH));
|
||||||
|
return DateTimeFormatter.ISO_LOCAL_DATE.format(localDate);
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// TODO: this parses English formatted dates only, we need a better approach to parse the textual date
|
// TODO: this parses English formatted dates only, we need a better approach to parse the textual date
|
||||||
Date d = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH).parse(
|
LocalDate localDate = LocalDate.parse(getTextFromObject(getVideoPrimaryInfoRenderer().getObject("dateText")),
|
||||||
getTextFromObject(getVideoPrimaryInfoRenderer().getObject("dateText")));
|
DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.ENGLISH));
|
||||||
return new SimpleDateFormat("yyyy-MM-dd").format(d);
|
return DateTimeFormatter.ISO_LOCAL_DATE.format(localDate);
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
}
|
||||||
throw new ParsingException("Could not get upload date");
|
throw new ParsingException("Could not get upload date");
|
||||||
|
@ -12,11 +12,14 @@ import org.schabi.newpipe.extractor.stream.StreamType;
|
|||||||
import org.schabi.newpipe.extractor.utils.Utils;
|
import org.schabi.newpipe.extractor.utils.Utils;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.text.SimpleDateFormat;
|
import java.time.Instant;
|
||||||
import java.util.Calendar;
|
import java.time.OffsetDateTime;
|
||||||
import java.util.Date;
|
import java.time.ZoneOffset;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.*;
|
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.fixThumbnailUrl;
|
||||||
|
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getTextFromObject;
|
||||||
|
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getUrlFromNavigationEndpoint;
|
||||||
import static org.schabi.newpipe.extractor.utils.JsonUtils.EMPTY_STRING;
|
import static org.schabi.newpipe.extractor.utils.JsonUtils.EMPTY_STRING;
|
||||||
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
||||||
|
|
||||||
@ -165,8 +168,7 @@ public class YoutubeStreamInfoItemExtractor implements StreamInfoItemExtractor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isPremiere()) {
|
if (isPremiere()) {
|
||||||
final Date date = getDateFromPremiere().getTime();
|
return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(getDateFromPremiere());
|
||||||
return new SimpleDateFormat("yyyy-MM-dd HH:mm").format(date);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final String publishedTimeText = getTextFromObject(videoInfo.getObject("publishedTimeText"));
|
final String publishedTimeText = getTextFromObject(videoInfo.getObject("publishedTimeText"));
|
||||||
@ -250,15 +252,13 @@ public class YoutubeStreamInfoItemExtractor implements StreamInfoItemExtractor {
|
|||||||
return videoInfo.has("upcomingEventData");
|
return videoInfo.has("upcomingEventData");
|
||||||
}
|
}
|
||||||
|
|
||||||
private Calendar getDateFromPremiere() throws ParsingException {
|
private OffsetDateTime getDateFromPremiere() throws ParsingException {
|
||||||
final JsonObject upcomingEventData = videoInfo.getObject("upcomingEventData");
|
final JsonObject upcomingEventData = videoInfo.getObject("upcomingEventData");
|
||||||
final String startTime = upcomingEventData.getString("startTime");
|
final String startTime = upcomingEventData.getString("startTime");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final long startTimeTimestamp = Long.parseLong(startTime);
|
return OffsetDateTime.ofInstant(Instant.ofEpochSecond(Long.parseLong(startTime)),
|
||||||
final Calendar calendar = Calendar.getInstance();
|
ZoneOffset.UTC);
|
||||||
calendar.setTime(new Date(startTimeTimestamp * 1000L));
|
|
||||||
return calendar;
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new ParsingException("Could not parse date from premiere: \"" + startTime + "\"");
|
throw new ParsingException("Could not parse date from premiere: \"" + startTime + "\"");
|
||||||
}
|
}
|
||||||
|
@ -12,14 +12,12 @@ import org.schabi.newpipe.extractor.stream.StreamType;
|
|||||||
import org.schabi.newpipe.extractor.stream.SubtitlesStream;
|
import org.schabi.newpipe.extractor.stream.SubtitlesStream;
|
||||||
import org.schabi.newpipe.extractor.stream.VideoStream;
|
import org.schabi.newpipe.extractor.stream.VideoStream;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import javax.annotation.Nullable;
|
||||||
import java.util.Calendar;
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.containsString;
|
import static org.hamcrest.CoreMatchers.containsString;
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
@ -171,13 +169,11 @@ public abstract class DefaultStreamExtractorTest extends DefaultExtractorTest<St
|
|||||||
} else {
|
} else {
|
||||||
assertNotNull(dateWrapper);
|
assertNotNull(dateWrapper);
|
||||||
|
|
||||||
final Calendar expectedDate = Calendar.getInstance();
|
final LocalDateTime expectedDateTime = LocalDateTime.parse(expectedUploadDate(),
|
||||||
final Calendar actualDate = dateWrapper.date();
|
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
|
||||||
|
final LocalDateTime actualDateTime = dateWrapper.offsetDateTime().toLocalDateTime();
|
||||||
|
|
||||||
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
|
assertEquals(expectedDateTime, actualDateTime);
|
||||||
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
|
|
||||||
expectedDate.setTime(sdf.parse(expectedUploadDate()));
|
|
||||||
assertEquals(expectedDate, actualDate);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,12 +6,15 @@ import org.schabi.newpipe.DownloaderTestImpl;
|
|||||||
import org.schabi.newpipe.extractor.ListExtractor;
|
import org.schabi.newpipe.extractor.ListExtractor;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
|
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.localization.DateWrapper;
|
||||||
|
import org.schabi.newpipe.extractor.localization.Localization;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
|
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
|
||||||
@ -23,7 +26,7 @@ import static org.schabi.newpipe.extractor.services.DefaultTests.defaultTestRela
|
|||||||
@Ignore("Should be ran manually from time to time, as it's too time consuming.")
|
@Ignore("Should be ran manually from time to time, as it's too time consuming.")
|
||||||
public class YoutubeChannelLocalizationTest {
|
public class YoutubeChannelLocalizationTest {
|
||||||
private static final boolean DEBUG = true;
|
private static final boolean DEBUG = true;
|
||||||
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAllSupportedLocalizations() throws Exception {
|
public void testAllSupportedLocalizations() throws Exception {
|
||||||
@ -64,7 +67,7 @@ public class YoutubeChannelLocalizationTest {
|
|||||||
+ "\n:::: " + item.getStreamType() + ", views = " + item.getViewCount();
|
+ "\n:::: " + item.getStreamType() + ", views = " + item.getViewCount();
|
||||||
final DateWrapper uploadDate = item.getUploadDate();
|
final DateWrapper uploadDate = item.getUploadDate();
|
||||||
if (uploadDate != null) {
|
if (uploadDate != null) {
|
||||||
String dateAsText = dateFormat.format(uploadDate.date().getTime());
|
String dateAsText = dateTimeFormatter.format(uploadDate.offsetDateTime());
|
||||||
debugMessage += "\n:::: " + item.getTextualUploadDate() +
|
debugMessage += "\n:::: " + item.getTextualUploadDate() +
|
||||||
"\n:::: " + dateAsText;
|
"\n:::: " + dateAsText;
|
||||||
}
|
}
|
||||||
@ -107,13 +110,13 @@ public class YoutubeChannelLocalizationTest {
|
|||||||
final DateWrapper currentUploadDate = currentItem.getUploadDate();
|
final DateWrapper currentUploadDate = currentItem.getUploadDate();
|
||||||
|
|
||||||
final String referenceDateString = referenceUploadDate == null ? "null" :
|
final String referenceDateString = referenceUploadDate == null ? "null" :
|
||||||
dateFormat.format(referenceUploadDate.date().getTime());
|
dateTimeFormatter.format(referenceUploadDate.offsetDateTime());
|
||||||
final String currentDateString = currentUploadDate == null ? "null" :
|
final String currentDateString = currentUploadDate == null ? "null" :
|
||||||
dateFormat.format(currentUploadDate.date().getTime());
|
dateTimeFormatter.format(currentUploadDate.offsetDateTime());
|
||||||
|
|
||||||
long difference = -1;
|
long difference = -1;
|
||||||
if (referenceUploadDate != null && currentUploadDate != null) {
|
if (referenceUploadDate != null && currentUploadDate != null) {
|
||||||
difference = Math.abs(referenceUploadDate.date().getTimeInMillis() - currentUploadDate.date().getTimeInMillis());
|
difference = ChronoUnit.MILLIS.between(referenceUploadDate.offsetDateTime(), currentUploadDate.offsetDateTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean areTimeEquals = difference < 5 * 60 * 1000L;
|
final boolean areTimeEquals = difference < 5 * 60 * 1000L;
|
||||||
|
Loading…
Reference in New Issue
Block a user