2017-08-29 02:38:37 +02:00
|
|
|
package org.schabi.newpipe.playlist;
|
|
|
|
|
|
|
|
import org.schabi.newpipe.extractor.InfoItem;
|
|
|
|
import org.schabi.newpipe.extractor.StreamingService;
|
|
|
|
import org.schabi.newpipe.extractor.playlist.PlayListExtractor;
|
|
|
|
import org.schabi.newpipe.extractor.playlist.PlayListInfo;
|
|
|
|
import org.schabi.newpipe.extractor.stream_info.StreamInfo;
|
|
|
|
import org.schabi.newpipe.extractor.stream_info.StreamInfoItem;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2017-08-31 19:07:18 +02:00
|
|
|
import java.util.Collections;
|
2017-08-29 02:38:37 +02:00
|
|
|
import java.util.List;
|
|
|
|
import java.util.concurrent.Callable;
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
|
|
import io.reactivex.Maybe;
|
|
|
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
2017-08-31 19:07:18 +02:00
|
|
|
import io.reactivex.disposables.Disposable;
|
2017-08-29 02:38:37 +02:00
|
|
|
import io.reactivex.functions.Consumer;
|
|
|
|
import io.reactivex.schedulers.Schedulers;
|
|
|
|
|
2017-08-29 17:00:11 +02:00
|
|
|
public class ExternalPlayQueue extends PlayQueue {
|
2017-08-31 19:07:18 +02:00
|
|
|
private final String TAG = "ExternalPlayQueue@" + Integer.toHexString(hashCode());
|
2017-08-29 17:00:11 +02:00
|
|
|
|
|
|
|
private boolean isComplete;
|
2017-08-29 02:38:37 +02:00
|
|
|
|
|
|
|
private StreamingService service;
|
2017-08-31 19:07:18 +02:00
|
|
|
private String playlistUrl;
|
2017-08-29 02:38:37 +02:00
|
|
|
|
2017-08-31 19:07:18 +02:00
|
|
|
private AtomicInteger pageNumber;
|
|
|
|
private Disposable fetchReactor;
|
|
|
|
|
|
|
|
public ExternalPlayQueue(final String playlistUrl,
|
|
|
|
final PlayListInfo info,
|
|
|
|
final int nextPage,
|
|
|
|
final int index) {
|
2017-09-01 21:10:36 +02:00
|
|
|
super(index, extractPlaylistItems(info));
|
|
|
|
|
2017-08-31 19:07:18 +02:00
|
|
|
this.service = getService(info.service_id);
|
|
|
|
this.pageNumber = new AtomicInteger(nextPage);
|
|
|
|
this.playlistUrl = playlistUrl;
|
2017-08-29 17:00:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isComplete() {
|
|
|
|
return isComplete;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2017-08-31 19:07:18 +02:00
|
|
|
public PlayQueueItem get(int index) {
|
|
|
|
if (index > getStreams().size() || getStreams().get(index) == null) return null;
|
|
|
|
return getStreams().get(index);
|
2017-08-29 02:38:37 +02:00
|
|
|
}
|
|
|
|
|
2017-08-31 19:07:18 +02:00
|
|
|
@Override
|
|
|
|
public void fetch() {
|
|
|
|
if (fetchReactor != null && !fetchReactor.isDisposed()) return;
|
2017-08-29 02:38:37 +02:00
|
|
|
|
|
|
|
final Callable<PlayListInfo> task = new Callable<PlayListInfo>() {
|
|
|
|
@Override
|
|
|
|
public PlayListInfo call() throws Exception {
|
2017-08-31 19:07:18 +02:00
|
|
|
PlayListExtractor extractor = service.getPlayListExtractorInstance(playlistUrl, pageNumber.get());
|
2017-08-29 02:38:37 +02:00
|
|
|
return PlayListInfo.getInfo(extractor);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
final Consumer<PlayListInfo> onSuccess = new Consumer<PlayListInfo>() {
|
|
|
|
@Override
|
|
|
|
public void accept(PlayListInfo playListInfo) throws Exception {
|
2017-08-29 17:00:11 +02:00
|
|
|
if (!playListInfo.hasNextPage) isComplete = true;
|
|
|
|
|
2017-08-31 19:07:18 +02:00
|
|
|
append(extractPlaylistItems(playListInfo));
|
|
|
|
pageNumber.incrementAndGet();
|
2017-08-29 02:38:37 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-08-31 19:07:18 +02:00
|
|
|
fetchReactor = Maybe.fromCallable(task)
|
2017-08-29 02:38:37 +02:00
|
|
|
.subscribeOn(Schedulers.io())
|
|
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
|
|
.onErrorComplete()
|
|
|
|
.subscribe(onSuccess);
|
|
|
|
}
|
|
|
|
|
2017-08-31 19:07:18 +02:00
|
|
|
@Override
|
|
|
|
public void dispose() {
|
2017-09-02 20:06:36 +02:00
|
|
|
super.dispose();
|
2017-08-31 19:07:18 +02:00
|
|
|
if (fetchReactor != null) fetchReactor.dispose();
|
|
|
|
}
|
|
|
|
|
2017-09-01 21:10:36 +02:00
|
|
|
private static List<PlayQueueItem> extractPlaylistItems(final PlayListInfo info) {
|
2017-08-29 17:00:11 +02:00
|
|
|
List<PlayQueueItem> result = new ArrayList<>();
|
2017-08-29 02:38:37 +02:00
|
|
|
for (final InfoItem stream : info.related_streams) {
|
|
|
|
if (stream instanceof StreamInfoItem) {
|
2017-08-29 17:00:11 +02:00
|
|
|
result.add(new PlayQueueItem((StreamInfoItem) stream));
|
2017-08-29 02:38:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|