diff --git a/src/main/java/me/kavin/piped/ServerLauncher.java b/src/main/java/me/kavin/piped/ServerLauncher.java index 6af8613..01a959e 100644 --- a/src/main/java/me/kavin/piped/ServerLauncher.java +++ b/src/main/java/me/kavin/piped/ServerLauncher.java @@ -332,7 +332,9 @@ public class ServerLauncher extends MultithreadedHttpServerLauncher { var json = Constants.mapper.readTree(request.loadBody().getResult().asArray()); var playlistId = json.get("playlistId").textValue(); var videoId = json.get("videoId").textValue(); - return getJsonResponse(ResponseHelper.addToPlaylistResponse(request.getHeader(AUTHORIZATION), playlistId, videoId), "private"); + var allowDupicatesValue = json.get("allowDuplicates"); + var allowDuplicates = allowDupicatesValue == null ? true : allowDupicatesValue.booleanValue(); + return getJsonResponse(ResponseHelper.addToPlaylistResponse(request.getHeader(AUTHORIZATION), playlistId, videoId, allowDuplicates), "private"); } catch (Exception e) { return getErrorResponse(e, request.getPath()); } diff --git a/src/main/java/me/kavin/piped/utils/ResponseHelper.java b/src/main/java/me/kavin/piped/utils/ResponseHelper.java index 4b3e1c4..9217609 100644 --- a/src/main/java/me/kavin/piped/utils/ResponseHelper.java +++ b/src/main/java/me/kavin/piped/utils/ResponseHelper.java @@ -1390,7 +1390,7 @@ public class ResponseHelper { ); } - public static byte[] addToPlaylistResponse(String session, String playlistId, String videoId) throws IOException, ExtractionException { + public static byte[] addToPlaylistResponse(String session, String playlistId, String videoId, Boolean allowDuplicates) throws IOException, ExtractionException { if (StringUtils.isBlank(playlistId) || StringUtils.isBlank(videoId)) return mapper.writeValueAsBytes(new InvalidRequestResponse()); @@ -1413,10 +1413,14 @@ public class ResponseHelper { return mapper.writeValueAsBytes(mapper.createObjectNode() .put("error", "Playlist not found")); - for (PlaylistVideo video : playlist.getVideos()) { - if (video.getId() == videoId) return mapper.writeValueAsBytes(mapper.createObjectNode() - .put("error", "Playlist already contains the video")); - }; + if (!allowDuplicates) { + for (PlaylistVideo video : playlist.getVideos()) { + if (video.getId() == videoId) + return mapper.writeValueAsBytes(mapper.createObjectNode() + .put("error", "The playlist already contains the video")); + } + ; + } if (playlist.getOwner().getId() != user.getId()) return mapper.writeValueAsBytes(mapper.createObjectNode()