mirror of
https://github.com/TeamNewPipe/NewPipeExtractor.git
synced 2025-04-29 08:20:34 +05:30
Add structure of channel tabs
This commit introduces the following breaking changes: - Three new classes have been added: - ChannelTabExtractor, class extending ListExtractor<InfoItem>, which extracts InfoItems from a channel tab; - ChannelTabInfo extending ListInfo<InfoItem>, which extracts InfoItems from a ChannelTabExtractor and returns them as a ChannelTabInfo; - ChannelTabs, an immutable class containing all supported channel tabs. - StreamingService implementations must implement new methods returning a channel tab LinkHandlerFactory (getChannelTabsLHFactory) and a ChannelTabExtractor (getChannelTabExtractor); - ChannelExtractor inherits Extractor instead of ListExtractor<StreamInfoItem> and ChannelInfo inherits Info instead of ListInfo<StreamInfoItem>; - ChannelExtractor and ChannelInfo have now getters and/or setters of tabs. Co-authored-by: ThetaDev <t.testboy@gmail.com> Co-authored-by: Stypox <stypox@pm.me>
This commit is contained in:
parent
3faaf4301c
commit
356a888d6c
@ -1,6 +1,7 @@
|
|||||||
package org.schabi.newpipe.extractor;
|
package org.schabi.newpipe.extractor;
|
||||||
|
|
||||||
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
|
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
|
||||||
|
import org.schabi.newpipe.extractor.channel.tabs.ChannelTabExtractor;
|
||||||
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
|
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
@ -140,6 +141,14 @@ public abstract class StreamingService {
|
|||||||
*/
|
*/
|
||||||
public abstract ListLinkHandlerFactory getChannelLHFactory();
|
public abstract ListLinkHandlerFactory getChannelLHFactory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Must return a new instance of an implementation of ListLinkHandlerFactory for channel tabs.
|
||||||
|
* If support for channel tabs is not given null must be returned.
|
||||||
|
*
|
||||||
|
* @return an instance of a ListLinkHandlerFactory for channels or null
|
||||||
|
*/
|
||||||
|
public abstract ListLinkHandlerFactory getChannelTabLHFactory();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Must return a new instance of an implementation of ListLinkHandlerFactory for playlists.
|
* Must return a new instance of an implementation of ListLinkHandlerFactory for playlists.
|
||||||
* If support for playlists is not given null must be returned.
|
* If support for playlists is not given null must be returned.
|
||||||
@ -204,6 +213,15 @@ public abstract class StreamingService {
|
|||||||
public abstract ChannelExtractor getChannelExtractor(ListLinkHandler linkHandler)
|
public abstract ChannelExtractor getChannelExtractor(ListLinkHandler linkHandler)
|
||||||
throws ExtractionException;
|
throws ExtractionException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Must create a new instance of a ChannelTabExtractor implementation.
|
||||||
|
*
|
||||||
|
* @param linkHandler is pointing to the channel which should be handled by this new instance.
|
||||||
|
* @return a new ChannelTabExtractor
|
||||||
|
*/
|
||||||
|
public abstract ChannelTabExtractor getChannelTabExtractor(ListLinkHandler linkHandler)
|
||||||
|
throws ExtractionException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Must crete a new instance of a PlaylistExtractor implementation.
|
* Must crete a new instance of a PlaylistExtractor implementation.
|
||||||
* @param linkHandler is pointing to the playlist which should be handled by this new instance.
|
* @param linkHandler is pointing to the playlist which should be handled by this new instance.
|
||||||
@ -262,6 +280,20 @@ public abstract class StreamingService {
|
|||||||
return getChannelExtractor(getChannelLHFactory().fromUrl(url));
|
return getChannelExtractor(getChannelLHFactory().fromUrl(url));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ChannelTabExtractor getChannelTabExtractorFromId(final String id, final String tab)
|
||||||
|
throws ExtractionException {
|
||||||
|
return getChannelTabExtractor(getChannelTabLHFactory().fromQuery(
|
||||||
|
id, Collections.singletonList(tab), ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChannelTabExtractor getChannelTabExtractorFromIdAndBaseUrl(final String id,
|
||||||
|
final String tab,
|
||||||
|
final String baseUrl)
|
||||||
|
throws ExtractionException {
|
||||||
|
return getChannelTabExtractor(getChannelTabLHFactory().fromQuery(
|
||||||
|
id, Collections.singletonList(tab), "", baseUrl));
|
||||||
|
}
|
||||||
|
|
||||||
public PlaylistExtractor getPlaylistExtractor(final String url) throws ExtractionException {
|
public PlaylistExtractor getPlaylistExtractor(final String url) throws ExtractionException {
|
||||||
return getPlaylistExtractor(getPlaylistLHFactory().fromUrl(url));
|
return getPlaylistExtractor(getPlaylistLHFactory().fromUrl(url));
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
package org.schabi.newpipe.extractor.channel;
|
package org.schabi.newpipe.extractor.channel;
|
||||||
|
|
||||||
import org.schabi.newpipe.extractor.ListExtractor;
|
import org.schabi.newpipe.extractor.Extractor;
|
||||||
import org.schabi.newpipe.extractor.StreamingService;
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Created by Christian Schabesberger on 25.07.16.
|
* Created by Christian Schabesberger on 25.07.16.
|
||||||
@ -26,11 +28,11 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
|||||||
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public abstract class ChannelExtractor extends ListExtractor<StreamInfoItem> {
|
public abstract class ChannelExtractor extends Extractor {
|
||||||
|
|
||||||
public static final long UNKNOWN_SUBSCRIBER_COUNT = -1;
|
public static final long UNKNOWN_SUBSCRIBER_COUNT = -1;
|
||||||
|
|
||||||
public ChannelExtractor(final StreamingService service, final ListLinkHandler linkHandler) {
|
protected ChannelExtractor(final StreamingService service, final ListLinkHandler linkHandler) {
|
||||||
super(service, linkHandler);
|
super(service, linkHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,5 +45,6 @@ public abstract class ChannelExtractor extends ListExtractor<StreamInfoItem> {
|
|||||||
public abstract String getParentChannelUrl() throws ParsingException;
|
public abstract String getParentChannelUrl() throws ParsingException;
|
||||||
public abstract String getParentChannelAvatarUrl() throws ParsingException;
|
public abstract String getParentChannelAvatarUrl() throws ParsingException;
|
||||||
public abstract boolean isVerified() throws ParsingException;
|
public abstract boolean isVerified() throws ParsingException;
|
||||||
|
@Nonnull
|
||||||
|
public abstract List<ListLinkHandler> getTabs() throws ParsingException;
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
package org.schabi.newpipe.extractor.channel;
|
package org.schabi.newpipe.extractor.channel;
|
||||||
|
|
||||||
import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage;
|
import org.schabi.newpipe.extractor.Info;
|
||||||
import org.schabi.newpipe.extractor.ListInfo;
|
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.Page;
|
|
||||||
import org.schabi.newpipe.extractor.StreamingService;
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
|
||||||
import org.schabi.newpipe.extractor.utils.ExtractorHelper;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Created by Christian Schabesberger on 31.07.16.
|
* Created by Christian Schabesberger on 31.07.16.
|
||||||
@ -32,16 +31,14 @@ import java.io.IOException;
|
|||||||
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ChannelInfo extends ListInfo<StreamInfoItem> {
|
public class ChannelInfo extends Info {
|
||||||
|
|
||||||
public ChannelInfo(final int serviceId,
|
public ChannelInfo(final int serviceId,
|
||||||
final String id,
|
final String id,
|
||||||
final String url,
|
final String url,
|
||||||
final String originalUrl,
|
final String originalUrl,
|
||||||
final String name,
|
final String name) {
|
||||||
final ListLinkHandler listLinkHandler) {
|
super(serviceId, id, url, originalUrl, name);
|
||||||
super(serviceId, id, url, originalUrl, name, listLinkHandler.getContentFilters(),
|
|
||||||
listLinkHandler.getSortFilter());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ChannelInfo getInfo(final String url) throws IOException, ExtractionException {
|
public static ChannelInfo getInfo(final String url) throws IOException, ExtractionException {
|
||||||
@ -55,13 +52,6 @@ public class ChannelInfo extends ListInfo<StreamInfoItem> {
|
|||||||
return getInfo(extractor);
|
return getInfo(extractor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static InfoItemsPage<StreamInfoItem> getMoreItems(final StreamingService service,
|
|
||||||
final String url,
|
|
||||||
final Page page)
|
|
||||||
throws IOException, ExtractionException {
|
|
||||||
return service.getChannelExtractor(url).getPage(page);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ChannelInfo getInfo(final ChannelExtractor extractor)
|
public static ChannelInfo getInfo(final ChannelExtractor extractor)
|
||||||
throws IOException, ExtractionException {
|
throws IOException, ExtractionException {
|
||||||
|
|
||||||
@ -71,35 +61,32 @@ public class ChannelInfo extends ListInfo<StreamInfoItem> {
|
|||||||
final String originalUrl = extractor.getOriginalUrl();
|
final String originalUrl = extractor.getOriginalUrl();
|
||||||
final String name = extractor.getName();
|
final String name = extractor.getName();
|
||||||
|
|
||||||
final ChannelInfo info =
|
final ChannelInfo info = new ChannelInfo(serviceId, id, url, originalUrl, name);
|
||||||
new ChannelInfo(serviceId, id, url, originalUrl, name, extractor.getLinkHandler());
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
info.setAvatarUrl(extractor.getAvatarUrl());
|
info.setAvatarUrl(extractor.getAvatarUrl());
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
info.addError(e);
|
info.addError(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
info.setBannerUrl(extractor.getBannerUrl());
|
info.setBannerUrl(extractor.getBannerUrl());
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
info.addError(e);
|
info.addError(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
info.setFeedUrl(extractor.getFeedUrl());
|
info.setFeedUrl(extractor.getFeedUrl());
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
info.addError(e);
|
info.addError(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
final InfoItemsPage<StreamInfoItem> itemsPage =
|
|
||||||
ExtractorHelper.getItemsPageOrLogError(info, extractor);
|
|
||||||
info.setRelatedItems(itemsPage.getItems());
|
|
||||||
info.setNextPage(itemsPage.getNextPage());
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
info.setSubscriberCount(extractor.getSubscriberCount());
|
info.setSubscriberCount(extractor.getSubscriberCount());
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
info.addError(e);
|
info.addError(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
info.setDescription(extractor.getDescription());
|
info.setDescription(extractor.getDescription());
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
@ -130,6 +117,12 @@ public class ChannelInfo extends ListInfo<StreamInfoItem> {
|
|||||||
info.addError(e);
|
info.addError(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
info.setTabs(extractor.getTabs());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
info.addError(e);
|
||||||
|
}
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,6 +137,8 @@ public class ChannelInfo extends ListInfo<StreamInfoItem> {
|
|||||||
private String[] donationLinks;
|
private String[] donationLinks;
|
||||||
private boolean verified;
|
private boolean verified;
|
||||||
|
|
||||||
|
private List<ListLinkHandler> tabs = List.of();
|
||||||
|
|
||||||
public String getParentChannelName() {
|
public String getParentChannelName() {
|
||||||
return parentChannelName;
|
return parentChannelName;
|
||||||
}
|
}
|
||||||
@ -223,4 +218,13 @@ public class ChannelInfo extends ListInfo<StreamInfoItem> {
|
|||||||
public void setVerified(final boolean verified) {
|
public void setVerified(final boolean verified) {
|
||||||
this.verified = verified;
|
this.verified = verified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public List<ListLinkHandler> getTabs() {
|
||||||
|
return tabs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTabs(@Nonnull final List<ListLinkHandler> tabs) {
|
||||||
|
this.tabs = tabs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
package org.schabi.newpipe.extractor.channel.tabs;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.extractor.InfoItem;
|
||||||
|
import org.schabi.newpipe.extractor.ListExtractor;
|
||||||
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
|
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link ListExtractor} of {@link InfoItem}s for tabs of channels.
|
||||||
|
*/
|
||||||
|
public abstract class ChannelTabExtractor extends ListExtractor<InfoItem> {
|
||||||
|
|
||||||
|
protected ChannelTabExtractor(@Nonnull final StreamingService service,
|
||||||
|
@Nonnull final ListLinkHandler linkHandler) {
|
||||||
|
super(service, linkHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return getLinkHandler().getContentFilters().get(0);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package org.schabi.newpipe.extractor.channel.tabs;
|
||||||
|
|
||||||
|
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.StreamingService;
|
||||||
|
import org.schabi.newpipe.extractor.channel.ChannelInfo;
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||||
|
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
||||||
|
import org.schabi.newpipe.extractor.utils.ExtractorHelper;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ChannelTabInfo extends ListInfo<InfoItem> {
|
||||||
|
|
||||||
|
public ChannelTabInfo(final int serviceId,
|
||||||
|
@Nonnull final ListLinkHandler linkHandler) {
|
||||||
|
super(serviceId, linkHandler, linkHandler.getContentFilters().get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a {@link ChannelTabInfo} instance from the given service and tab handler.
|
||||||
|
*
|
||||||
|
* @param service streaming service
|
||||||
|
* @param linkHandler Channel tab handler (from {@link ChannelInfo})
|
||||||
|
* @return the extracted {@link ChannelTabInfo}
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
public static ChannelTabInfo getInfo(@Nonnull final StreamingService service,
|
||||||
|
@Nonnull final ListLinkHandler linkHandler)
|
||||||
|
throws ExtractionException, IOException {
|
||||||
|
final ChannelTabExtractor extractor = service.getChannelTabExtractor(linkHandler);
|
||||||
|
extractor.fetchPage();
|
||||||
|
return getInfo(extractor);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a {@link ChannelTabInfo} instance from a {@link ChannelTabExtractor}.
|
||||||
|
*
|
||||||
|
* @param extractor an extractor where {@code fetchPage()} was already got called on
|
||||||
|
* @return the extracted {@link ChannelTabInfo}
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
public static ChannelTabInfo getInfo(@Nonnull final ChannelTabExtractor extractor) {
|
||||||
|
final ChannelTabInfo info =
|
||||||
|
new ChannelTabInfo(extractor.getServiceId(), extractor.getLinkHandler());
|
||||||
|
|
||||||
|
try {
|
||||||
|
info.setOriginalUrl(extractor.getOriginalUrl());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
info.addError(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
final ListExtractor.InfoItemsPage<InfoItem> page
|
||||||
|
= ExtractorHelper.getItemsPageOrLogError(info, extractor);
|
||||||
|
info.setRelatedItems(page.getItems());
|
||||||
|
info.setNextPage(page.getNextPage());
|
||||||
|
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ListExtractor.InfoItemsPage<InfoItem> getMoreItems(
|
||||||
|
@Nonnull final StreamingService service,
|
||||||
|
@Nonnull final ListLinkHandler linkHandler,
|
||||||
|
@Nonnull final Page page) throws ExtractionException, IOException {
|
||||||
|
return service.getChannelTabExtractor(linkHandler).getPage(page);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package org.schabi.newpipe.extractor.channel.tabs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constants of channel tabs supported by the extractor.
|
||||||
|
*/
|
||||||
|
public final class ChannelTabs {
|
||||||
|
public static final String VIDEOS = "videos";
|
||||||
|
public static final String TRACKS = "tracks";
|
||||||
|
public static final String SHORTS = "shorts";
|
||||||
|
public static final String LIVESTREAMS = "livestreams";
|
||||||
|
public static final String CHANNELS = "channels";
|
||||||
|
public static final String PLAYLISTS = "playlists";
|
||||||
|
public static final String ALBUMS = "albums";
|
||||||
|
|
||||||
|
private ChannelTabs() {
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user