Skip to content

Commit fdfeac0

Browse files
Jared234Stypox
authored andcommitted
Implemented a warning before adding duplicate to playlist.
1 parent 262b3a2 commit fdfeac0

4 files changed

Lines changed: 49 additions & 1 deletion

File tree

app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_ID;
2727
import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_TABLE;
2828
import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_THUMBNAIL_URL;
29+
import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_URL;
2930
import static org.schabi.newpipe.database.stream.model.StreamStateEntity.JOIN_STREAM_ID_ALIAS;
3031
import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_PROGRESS_MILLIS;
3132
import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_STATE_TABLE;
@@ -49,6 +50,16 @@ default Flowable<List<PlaylistStreamEntity>> listByService(final int serviceId)
4950
+ " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId")
5051
void deleteBatch(long playlistId);
5152

53+
@Query("SELECT COALESCE(COUNT(*), 0)"
54+
+ " FROM " + STREAM_TABLE
55+
+ " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE
56+
+ " ON " + STREAM_ID + " = " + JOIN_STREAM_ID
57+
+ " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId "
58+
+ " AND " + STREAM_URL + " = :streamURL"
59+
)
60+
Flowable<Integer> getDuplicates(long playlistId, String streamURL);
61+
62+
5263
@Query("SELECT COALESCE(MAX(" + JOIN_INDEX + "), -1)"
5364
+ " FROM " + PLAYLIST_STREAM_JOIN_TABLE
5465
+ " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId")

app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.schabi.newpipe.local.dialog;
22

3+
import android.app.AlertDialog;
34
import android.os.Bundle;
45
import android.view.LayoutInflater;
56
import android.view.View;
@@ -128,6 +129,19 @@ private void onPlaylistsReceived(@NonNull final List<PlaylistMetadataEntry> play
128129
private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager,
129130
@NonNull final PlaylistMetadataEntry playlist,
130131
@NonNull final List<StreamEntity> streams) {
132+
133+
final int numOfDuplicates = manager.getPlaylistDuplicates(playlist.uid,
134+
streams.get(0).getUrl()).blockingFirst();
135+
if (numOfDuplicates > 0) {
136+
createDuplicateDialog(numOfDuplicates, manager, playlist, streams);
137+
} else {
138+
addStreamToPlaylist(manager, playlist, streams);
139+
}
140+
}
141+
142+
private void addStreamToPlaylist(@NonNull final LocalPlaylistManager manager,
143+
@NonNull final PlaylistMetadataEntry playlist,
144+
@NonNull final List<StreamEntity> streams) {
131145
final Toast successToast = Toast.makeText(getContext(),
132146
R.string.playlist_add_stream_success, Toast.LENGTH_SHORT);
133147

@@ -142,7 +156,23 @@ private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager,
142156
playlistDisposables.add(manager.appendToPlaylist(playlist.uid, streams)
143157
.observeOn(AndroidSchedulers.mainThread())
144158
.subscribe(ignored -> successToast.show()));
145-
146159
requireDialog().dismiss();
147160
}
161+
162+
private void createDuplicateDialog(final int duplicates,
163+
@NonNull final LocalPlaylistManager manager,
164+
@NonNull final PlaylistMetadataEntry playlist,
165+
@NonNull final List<StreamEntity> streams) {
166+
//TODO: change color
167+
final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
168+
builder.setTitle(R.string.duplicate_stream_in_playlist_title);
169+
builder.setMessage(getString(R.string.duplicate_stream_in_playlist_description,
170+
duplicates));
171+
172+
builder.setPositiveButton(android.R.string.yes, (dialog, i) -> {
173+
addStreamToPlaylist(manager, playlist, streams);
174+
});
175+
builder.setNeutralButton(R.string.cancel, null);
176+
builder.create().show();
177+
}
148178
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ public Flowable<List<PlaylistStreamEntry>> getPlaylistStreams(final long playlis
9191
return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io());
9292
}
9393

94+
public Flowable<Integer> getPlaylistDuplicates(final long playlistId, final String streamURL) {
95+
return playlistStreamTable.getDuplicates(playlistId, streamURL);
96+
}
97+
9498
public Single<Integer> deletePlaylist(final long playlistId) {
9599
return Single.fromCallable(() -> playlistTable.deletePlaylist(playlistId))
96100
.subscribeOn(Schedulers.io());

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,9 @@
447447
<string name="playlist_add_stream_success">Playlisted</string>
448448
<string name="playlist_thumbnail_change_success">Playlist thumbnail changed.</string>
449449
<string name="playlist_no_uploader">Auto-generated (no uploader found)</string>
450+
<string name="duplicate_stream_in_playlist_title">Duplicated Video Found</string>
451+
<string name="duplicate_stream_in_playlist_description">The playlist contains this stream
452+
already %d time(s).\nDo you want to add it one more time?</string>
450453
<!-- Players -->
451454
<string name="caption_none">No Captions</string>
452455
<string name="resize_fit">Fit</string>

0 commit comments

Comments
 (0)