Skip to content

Commit 24bb71a

Browse files
committed
[#11930] Making it more efficient: Reverse iteration + limit(50) + reverse
1 parent b1f995a commit 24bb71a

2 files changed

Lines changed: 54 additions & 27 deletions

File tree

app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package org.schabi.newpipe.local.playlist;
22

3+
import static com.google.common.collect.Streams.stream;
4+
import static org.apache.commons.collections4.IterableUtils.reversedIterable;
35
import static org.schabi.newpipe.error.ErrorUtil.showUiErrorSnackbar;
46
import static org.schabi.newpipe.ktx.ViewUtils.animate;
57
import static org.schabi.newpipe.local.playlist.PlayListShareMode.JUST_URLS;
68
import static org.schabi.newpipe.local.playlist.PlayListShareMode.WITH_TITLES;
79
import static org.schabi.newpipe.local.playlist.PlayListShareMode.YOUTUBE_TEMP_PLAYLIST;
810
import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout;
911

12+
import static java.util.Collections.reverse;
13+
1014
import android.content.Context;
1115
import android.os.Bundle;
1216
import android.os.Parcelable;
@@ -30,7 +34,9 @@
3034
import androidx.viewbinding.ViewBinding;
3135

3236
import com.evernote.android.state.State;
37+
import com.google.common.collect.Streams;
3338

39+
import org.apache.commons.collections4.IterableUtils;
3440
import org.apache.commons.collections4.queue.CircularFifoQueue;
3541
import org.reactivestreams.Subscriber;
3642
import org.reactivestreams.Subscription;
@@ -408,7 +414,7 @@ private void sharePlaylist(final PlayListShareMode shareMode) {
408414
.flatMapSingle(playlist -> Single.just(export(
409415

410416
shareMode,
411-
playlist.stream().map(PlaylistStreamEntry::getStreamEntity),
417+
playlist,
412418
context
413419
)))
414420
.observeOn(AndroidSchedulers.mainThread())
@@ -430,20 +436,21 @@ private void sharePlaylist(final PlayListShareMode shareMode) {
430436
}
431437

432438
static String export(final PlayListShareMode shareMode,
433-
final Stream<StreamEntity> entityStream,
439+
final List<PlaylistStreamEntry> playlist,
434440
final Context context) {
435441

436442
return switch (shareMode) {
437443

438-
case WITH_TITLES -> exportWithTitles(entityStream, context);
439-
case JUST_URLS -> exportJustUrls(entityStream);
440-
case YOUTUBE_TEMP_PLAYLIST -> exportAsYoutubeTempPlaylist(entityStream);
444+
case WITH_TITLES -> exportWithTitles(playlist, context);
445+
case JUST_URLS -> exportJustUrls(playlist);
446+
case YOUTUBE_TEMP_PLAYLIST -> exportAsYoutubeTempPlaylist(playlist);
441447
};
442448
}
443449

444-
static String exportWithTitles(final Stream<StreamEntity> entityStream, final Context context) {
450+
static String exportWithTitles(final List<PlaylistStreamEntry> playlist, final Context context) {
445451

446-
return entityStream
452+
return playlist.stream()
453+
.map(PlaylistStreamEntry::getStreamEntity)
447454
.map(entity -> context.getString(R.string.video_details_list_item,
448455
entity.getTitle(),
449456
entity.getUrl()
@@ -452,26 +459,30 @@ static String exportWithTitles(final Stream<StreamEntity> entityStream, final Co
452459
.collect(Collectors.joining("\n"));
453460
}
454461

455-
static String exportJustUrls(final Stream<StreamEntity> entityStream) {
462+
static String exportJustUrls(final List<PlaylistStreamEntry> playlist) {
456463

457-
return entityStream
464+
return playlist.stream()
465+
.map(PlaylistStreamEntry::getStreamEntity)
458466
.map(StreamEntity::getUrl)
459467
.collect(Collectors.joining("\n"));
460468
}
461469

462-
static String exportAsYoutubeTempPlaylist(final Stream<StreamEntity> entityStream) {
463-
464-
final CircularFifoQueue<String> last50 = new CircularFifoQueue<>(50);
470+
static String exportAsYoutubeTempPlaylist(final List<PlaylistStreamEntry> playlist) {
465471

466-
entityStream
472+
final List<String> videoIDs =
473+
stream(reversedIterable(playlist))
474+
.map(PlaylistStreamEntry::getStreamEntity)
467475
.map(entity -> getYouTubeId(entity.getUrl()))
468476
.filter(Objects::nonNull)
469-
.forEachOrdered(last50::add);
477+
.limit(50)
478+
.collect(Collectors.toList());
479+
480+
reverse(videoIDs);
470481

471-
final String videoIDs = last50.stream()
472-
.collect(Collectors.joining(","));
482+
final String commaSeparatedVideoIDs = videoIDs.stream()
483+
.collect(Collectors.joining(","));
473484

474-
return "http://www.youtube.com/watch_videos?video_ids=" + videoIDs;
485+
return "http://www.youtube.com/watch_videos?video_ids=" + commaSeparatedVideoIDs;
475486
}
476487

477488
/**

app/src/test/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragmentTest.java

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import org.junit.Assert;
99
import org.junit.Test;
10+
import org.schabi.newpipe.database.playlist.PlaylistStreamEntry;
1011
import org.schabi.newpipe.database.stream.model.StreamEntity;
1112
import org.schabi.newpipe.extractor.stream.StreamType;
1213

@@ -18,15 +19,15 @@ public class LocalPlaylistFragmentTest {
1819
@Test
1920
public void exportAsYouTubeTempPlaylist() {
2021

21-
final Stream<StreamEntity> entityStream = asStreamEntityStream(
22+
final List<PlaylistStreamEntry> playlist = asPlaylist(
2223

2324
"https://www.youtube.com/watch?v=1",
2425
"https://soundcloud.com/cautious-clayofficial/cold-war-2", // non-Youtube URLs should be
2526
"https://www.youtube.com/watch?v=2", // ignored
2627
"https://www.youtube.com/watch?v=3"
2728
);
2829

29-
final String url = LocalPlaylistFragment.export(YOUTUBE_TEMP_PLAYLIST, entityStream, null);
30+
final String url = LocalPlaylistFragment.export(YOUTUBE_TEMP_PLAYLIST, playlist, null);
3031

3132
Assert.assertEquals("http://www.youtube.com/watch_videos?video_ids=1,2,3", url);
3233
}
@@ -48,11 +49,13 @@ public void exportMoreThan50Items() {
4849
41, 42, 43, 44, 45, 46, 47, 48, 49, 50
4950
);
5051

51-
final Stream<StreamEntity> entityStream = ids.stream()
52+
final List<PlaylistStreamEntry> playlist = asPlaylist(
53+
54+
ids.stream()
5255
.map(id -> "https://www.youtube.com/watch?v=" + id)
53-
.map(LocalPlaylistFragmentTest::newStreamEntity);
56+
);
5457

55-
final String url = LocalPlaylistFragment.export(YOUTUBE_TEMP_PLAYLIST, entityStream, null);
58+
final String url = LocalPlaylistFragment.export(YOUTUBE_TEMP_PLAYLIST, playlist, null);
5659

5760
Assert.assertEquals(
5861

@@ -70,14 +73,14 @@ public void exportMoreThan50Items() {
7073
@Test
7174
public void exportJustUrls() {
7275

73-
final Stream<StreamEntity> entityStream = asStreamEntityStream(
76+
final List<PlaylistStreamEntry> playlist = asPlaylist(
7477

7578
"https://www.youtube.com/watch?v=1",
7679
"https://www.youtube.com/watch?v=2",
7780
"https://www.youtube.com/watch?v=3"
7881
);
7982

80-
final String exported = LocalPlaylistFragment.export(JUST_URLS, entityStream, null);
83+
final String exported = LocalPlaylistFragment.export(JUST_URLS, playlist, null);
8184

8285
Assert.assertEquals("""
8386
https://www.youtube.com/watch?v=1
@@ -86,10 +89,23 @@ public void exportJustUrls() {
8689
}
8790

8891
@NonNull
89-
private static Stream<StreamEntity> asStreamEntityStream(final String... urls) {
92+
static List<PlaylistStreamEntry> asPlaylist(final String... urls) {
93+
94+
return asPlaylist(Stream.of(urls));
95+
}
96+
97+
@NonNull
98+
static List<PlaylistStreamEntry> asPlaylist(final Stream<String> urls) {
99+
100+
return urls
101+
.map(LocalPlaylistFragmentTest::newPlaylistStreamEntry)
102+
.toList();
103+
}
104+
105+
@NonNull
106+
private static PlaylistStreamEntry newPlaylistStreamEntry(final String url) {
90107

91-
return Stream.of(urls)
92-
.map(LocalPlaylistFragmentTest::newStreamEntity);
108+
return new PlaylistStreamEntry(newStreamEntity(url), 0, 0, 0);
93109
}
94110

95111
@NonNull

0 commit comments

Comments
 (0)