diff --git a/app/build.gradle b/app/build.gradle index 0c2c20357..e6c768cd3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -163,7 +163,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.TeamNewPipe:NewPipeExtractor:54d9e5a2f89d6d739dadb6c744efeaf981c85bef' + implementation 'com.github.wb9688:NewPipeExtractor:4890b2906f805ccfccc83be13d954ed2cb8fc4e5' implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751" implementation "org.jsoup:jsoup:1.13.1" diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java index aed7c4795..82b1d18ed 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.ListInfo; +import org.schabi.newpipe.extractor.Page; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.views.NewPipeRecyclerView; @@ -30,7 +31,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo> protected String url; protected I currentInfo; - protected String currentNextPageUrl; + protected Page currentNextPage; protected Disposable currentWorker; @Override @@ -78,7 +79,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo> public void writeTo(final Queue<Object> objectsToSave) { super.writeTo(objectsToSave); objectsToSave.add(currentInfo); - objectsToSave.add(currentNextPageUrl); + objectsToSave.add(currentNextPage); } @Override @@ -86,7 +87,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo> public void readFrom(@NonNull final Queue<Object> savedObjects) throws Exception { super.readFrom(savedObjects); currentInfo = (I) savedObjects.poll(); - currentNextPageUrl = (String) savedObjects.poll(); + currentNextPage = (Page) savedObjects.poll(); } /*////////////////////////////////////////////////////////////////////////// @@ -130,7 +131,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo> .subscribe((@NonNull I result) -> { isLoading.set(false); currentInfo = result; - currentNextPageUrl = result.getNextPageUrl(); + currentNextPage = result.getNextPage(); handleResult(result); }, (@NonNull Throwable throwable) -> onError(throwable)); } @@ -182,7 +183,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo> @Override public void handleNextItems(final ListExtractor.InfoItemsPage result) { super.handleNextItems(result); - currentNextPageUrl = result.getNextPageUrl(); + currentNextPage = result.getNextPage(); infoListAdapter.addInfoItemList(result.getItems()); showListFooter(hasMoreItems()); @@ -190,7 +191,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo> @Override protected boolean hasMoreItems() { - return !TextUtils.isEmpty(currentNextPageUrl); + return Page.isValid(currentNextPage); } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index b88d375ff..330aa7b42 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -403,7 +403,7 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> @Override protected Single<ListExtractor.InfoItemsPage> loadMoreItemsLogic() { - return ExtractorHelper.getMoreChannelItems(serviceId, url, currentNextPageUrl); + return ExtractorHelper.getMoreChannelItems(serviceId, url, currentNextPage); } @Override @@ -555,7 +555,7 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> } } return new ChannelPlayQueue(currentInfo.getServiceId(), currentInfo.getUrl(), - currentInfo.getNextPageUrl(), streamItems, index); + currentInfo.getNextPage(), streamItems, index); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java index d23293c8a..c8e18f610 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -71,7 +71,7 @@ public class CommentsFragment extends BaseListInfoFragment<CommentsInfo> { @Override protected Single<ListExtractor.InfoItemsPage> loadMoreItemsLogic() { - return ExtractorHelper.getMoreCommentItems(serviceId, currentInfo, currentNextPageUrl); + return ExtractorHelper.getMoreCommentItems(serviceId, currentInfo, currentNextPage); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/DefaultKioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/DefaultKioskFragment.java index 0702553ad..4b758a9c0 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/DefaultKioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/DefaultKioskFragment.java @@ -44,7 +44,7 @@ public class DefaultKioskFragment extends KioskFragment { name = kioskTranslatedName; currentInfo = null; - currentNextPageUrl = null; + currentNextPage = null; } catch (ExtractionException e) { onUnrecoverableError(e, UserAction.REQUESTED_KIOSK, "none", "Loading default kiosk from selected service", 0); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 21a7944ee..a9dc59951 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -150,7 +150,7 @@ public class KioskFragment extends BaseListInfoFragment<KioskInfo> { @Override public Single<ListExtractor.InfoItemsPage> loadMoreItemsLogic() { - return ExtractorHelper.getMoreKioskItems(serviceId, url, currentNextPageUrl); + return ExtractorHelper.getMoreKioskItems(serviceId, url, currentNextPage); } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 93df98c97..e2ec9c1f3 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -229,7 +229,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> { @Override protected Single<ListExtractor.InfoItemsPage> loadMoreItemsLogic() { - return ExtractorHelper.getMorePlaylistItems(serviceId, url, currentNextPageUrl); + return ExtractorHelper.getMorePlaylistItems(serviceId, url, currentNextPage); } @Override @@ -349,7 +349,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> { return new PlaylistPlayQueue( currentInfo.getServiceId(), currentInfo.getUrl(), - currentInfo.getNextPageUrl(), + currentInfo.getNextPage(), infoItems, index ); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 9bfead4f0..55f286b9d 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -37,6 +37,7 @@ import org.schabi.newpipe.database.history.model.SearchHistoryEntry; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.Page; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.search.SearchExtractor; @@ -123,8 +124,7 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I private Map<Integer, String> menuItemToFilterName; private StreamingService service; - private String currentPageUrl; - private String nextPageUrl; + private Page nextPage; private String contentCountry; private boolean isSuggestionsEnabled = true; @@ -354,15 +354,13 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I @Override public void writeTo(final Queue<Object> objectsToSave) { super.writeTo(objectsToSave); - objectsToSave.add(currentPageUrl); - objectsToSave.add(nextPageUrl); + objectsToSave.add(nextPage); } @Override public void readFrom(@NonNull final Queue<Object> savedObjects) throws Exception { super.readFrom(savedObjects); - currentPageUrl = (String) savedObjects.poll(); - nextPageUrl = (String) savedObjects.poll(); + nextPage = (Page) savedObjects.poll(); } @Override @@ -845,7 +843,7 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I @Override protected void loadMoreItems() { - if (nextPageUrl == null || nextPageUrl.isEmpty()) { + if (!Page.isValid(nextPage)) { return; } isLoading.set(true); @@ -858,7 +856,7 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I searchString, asList(contentFilter), sortFilter, - nextPageUrl) + nextPage) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnEvent((nextItemsResult, throwable) -> isLoading.set(false)) @@ -962,8 +960,7 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I } lastSearchedString = searchString; - nextPageUrl = result.getNextPageUrl(); - currentPageUrl = result.getUrl(); + nextPage = result.getNextPage(); if (infoListAdapter.getItemsList().size() == 0) { if (!result.getRelatedItems().isEmpty()) { @@ -981,14 +978,15 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I @Override public void handleNextItems(final ListExtractor.InfoItemsPage result) { showListFooter(false); - currentPageUrl = result.getNextPageUrl(); infoListAdapter.addInfoItemList(result.getItems()); - nextPageUrl = result.getNextPageUrl(); + nextPage = result.getNextPage(); if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.SEARCHED, NewPipe.getNameOfService(serviceId), - "\"" + searchString + "\" → page: " + nextPageUrl, 0); + "\"" + searchString + "\" → pageUrl: " + nextPage.getUrl() + ", " + + "pageIds: " + nextPage.getIds() + ", " + + "pageCookies: " + nextPage.getCookies(), 0); } super.handleNextItems(result); } diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java index f0d6dc6ec..cde376f4f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java @@ -5,6 +5,7 @@ import android.util.Log; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.ListInfo; +import org.schabi.newpipe.extractor.Page; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import java.util.ArrayList; @@ -21,7 +22,7 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext final int serviceId; final String baseUrl; - String nextUrl; + Page nextPage; private transient Disposable fetchReactor; @@ -29,16 +30,16 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext this(item.getServiceId(), item.getUrl(), null, Collections.emptyList(), 0); } - AbstractInfoPlayQueue(final int serviceId, final String url, final String nextPageUrl, + AbstractInfoPlayQueue(final int serviceId, final String url, final Page nextPage, final List<StreamInfoItem> streams, final int index) { super(index, extractListItems(streams)); this.baseUrl = url; - this.nextUrl = nextPageUrl; + this.nextPage = nextPage; this.serviceId = serviceId; this.isInitial = streams.isEmpty(); - this.isComplete = !isInitial && (nextPageUrl == null || nextPageUrl.isEmpty()); + this.isComplete = !isInitial && !Page.isValid(nextPage); } protected abstract String getTag(); @@ -66,7 +67,7 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext if (!result.hasNextPage()) { isComplete = true; } - nextUrl = result.getNextPageUrl(); + nextPage = result.getNextPage(); append(extractListItems(result.getRelatedItems())); @@ -100,7 +101,7 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext if (!result.hasNextPage()) { isComplete = true; } - nextUrl = result.getNextPageUrl(); + nextPage = result.getNextPage(); append(extractListItems(result.getItems())); diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelPlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelPlayQueue.java index 5a2e34d31..9e0d2b694 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelPlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelPlayQueue.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.player.playqueue; +import org.schabi.newpipe.extractor.Page; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; @@ -17,15 +18,15 @@ public final class ChannelPlayQueue extends AbstractInfoPlayQueue<ChannelInfo, C } public ChannelPlayQueue(final ChannelInfo info) { - this(info.getServiceId(), info.getUrl(), info.getNextPageUrl(), info.getRelatedItems(), 0); + this(info.getServiceId(), info.getUrl(), info.getNextPage(), info.getRelatedItems(), 0); } public ChannelPlayQueue(final int serviceId, final String url, - final String nextPageUrl, + final Page nextPage, final List<StreamInfoItem> streams, final int index) { - super(serviceId, url, nextPageUrl, streams, index); + super(serviceId, url, nextPage, streams, index); } @Override @@ -41,7 +42,7 @@ public final class ChannelPlayQueue extends AbstractInfoPlayQueue<ChannelInfo, C .observeOn(AndroidSchedulers.mainThread()) .subscribe(getHeadListObserver()); } else { - ExtractorHelper.getMoreChannelItems(this.serviceId, this.baseUrl, this.nextUrl) + ExtractorHelper.getMoreChannelItems(this.serviceId, this.baseUrl, this.nextPage) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getNextPageObserver()); diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlaylistPlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlaylistPlayQueue.java index fcb7080c5..077702747 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlaylistPlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlaylistPlayQueue.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.player.playqueue; +import org.schabi.newpipe.extractor.Page; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; @@ -16,15 +17,15 @@ public final class PlaylistPlayQueue extends AbstractInfoPlayQueue<PlaylistInfo, } public PlaylistPlayQueue(final PlaylistInfo info) { - this(info.getServiceId(), info.getUrl(), info.getNextPageUrl(), info.getRelatedItems(), 0); + this(info.getServiceId(), info.getUrl(), info.getNextPage(), info.getRelatedItems(), 0); } public PlaylistPlayQueue(final int serviceId, final String url, - final String nextPageUrl, + final Page nextPage, final List<StreamInfoItem> streams, final int index) { - super(serviceId, url, nextPageUrl, streams, index); + super(serviceId, url, nextPage, streams, index); } @Override @@ -40,7 +41,7 @@ public final class PlaylistPlayQueue extends AbstractInfoPlayQueue<PlaylistInfo, .observeOn(AndroidSchedulers.mainThread()) .subscribe(getHeadListObserver()); } else { - ExtractorHelper.getMorePlaylistItems(this.serviceId, this.baseUrl, this.nextUrl) + ExtractorHelper.getMorePlaylistItems(this.serviceId, this.baseUrl, this.nextPage) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getNextPageObserver()); diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index cd5992fb4..9b8b2494e 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -33,6 +33,7 @@ import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage; import org.schabi.newpipe.extractor.ListInfo; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.Page; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.comments.CommentsInfo; @@ -87,14 +88,13 @@ public final class ExtractorHelper { final String searchString, final List<String> contentFilter, final String sortFilter, - final String pageUrl) { + final Page page) { checkServiceId(serviceId); return Single.fromCallable(() -> SearchInfo.getMoreItems(NewPipe.getService(serviceId), NewPipe.getService(serviceId) .getSearchQHFactory() - .fromQuery(searchString, contentFilter, sortFilter), - pageUrl)); + .fromQuery(searchString, contentFilter, sortFilter), page)); } @@ -125,10 +125,10 @@ public final class ExtractorHelper { } public static Single<InfoItemsPage> getMoreChannelItems(final int serviceId, final String url, - final String nextStreamsUrl) { + final Page nextPage) { checkServiceId(serviceId); return Single.fromCallable(() -> - ChannelInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl)); + ChannelInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage)); } public static Single<ListInfo<StreamInfoItem>> getFeedInfoFallbackToChannelInfo( @@ -157,10 +157,10 @@ public final class ExtractorHelper { public static Single<InfoItemsPage> getMoreCommentItems(final int serviceId, final CommentsInfo info, - final String nextPageUrl) { + final Page nextPage) { checkServiceId(serviceId); return Single.fromCallable(() -> - CommentsInfo.getMoreItems(NewPipe.getService(serviceId), info, nextPageUrl)); + CommentsInfo.getMoreItems(NewPipe.getService(serviceId), info, nextPage)); } public static Single<PlaylistInfo> getPlaylistInfo(final int serviceId, final String url, @@ -172,10 +172,10 @@ public final class ExtractorHelper { } public static Single<InfoItemsPage> getMorePlaylistItems(final int serviceId, final String url, - final String nextStreamsUrl) { + final Page nextPage) { checkServiceId(serviceId); return Single.fromCallable(() -> - PlaylistInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl)); + PlaylistInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage)); } public static Single<KioskInfo> getKioskInfo(final int serviceId, final String url, @@ -184,12 +184,10 @@ public final class ExtractorHelper { Single.fromCallable(() -> KioskInfo.getInfo(NewPipe.getService(serviceId), url))); } - public static Single<InfoItemsPage> getMoreKioskItems(final int serviceId, - final String url, - final String nextStreamsUrl) { + public static Single<InfoItemsPage> getMoreKioskItems(final int serviceId, final String url, + final Page nextPage) { return Single.fromCallable(() -> - KioskInfo.getMoreItems(NewPipe.getService(serviceId), - url, nextStreamsUrl)); + KioskInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage)); } /*////////////////////////////////////////////////////////////////////////// @@ -240,8 +238,8 @@ public final class ExtractorHelper { * @param infoType the {@link InfoItem.InfoType} of the item * @return a {@link Single} that loads the item */ - public static <I extends Info> Maybe<I> loadFromCache(final int serviceId, final String url, - final InfoItem.InfoType infoType) { + private static <I extends Info> Maybe<I> loadFromCache(final int serviceId, final String url, + final InfoItem.InfoType infoType) { checkServiceId(serviceId); return Maybe.defer(() -> { //noinspection unchecked