diff --git a/src/main/java/com/example/video_downloader/controllers/VideoController.java b/src/main/java/com/example/video_downloader/controllers/VideoController.java index 7e8b109..5d514ed 100644 --- a/src/main/java/com/example/video_downloader/controllers/VideoController.java +++ b/src/main/java/com/example/video_downloader/controllers/VideoController.java @@ -29,10 +29,6 @@ public class VideoController { @Autowired private YTDLPService ytdlpService; - @Data - private static class Response { - private Long id; - } @Data private static class Trigger { @@ -40,14 +36,8 @@ public class VideoController { } @PostMapping(path = "/videos") - public Response saveNewVideo(@RequestBody SaveNewVideoRequest request){ - - Response response = new Response(); - Video video = videoService.saveNewVideo(request); - response.setId(video.getId()); - - return response; - + public Video saveNewVideo(@RequestBody SaveNewVideoRequest request){ + return videoService.saveNewVideo(request); } @PostMapping(path = "/playlists") @@ -71,6 +61,7 @@ public class VideoController { public int getJobDone(@RequestBody Trigger trigger) throws IOException, InterruptedException { int statusCode = 200; if(trigger.input) { + ytdlpService.processPlaylist(); ytdlpService.validateVideos(); } return statusCode; diff --git a/src/main/java/com/example/video_downloader/entity/Playlist.java b/src/main/java/com/example/video_downloader/entity/Playlist.java index ce0c49f..e9ddd3d 100644 --- a/src/main/java/com/example/video_downloader/entity/Playlist.java +++ b/src/main/java/com/example/video_downloader/entity/Playlist.java @@ -17,9 +17,13 @@ public class Playlist { @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; + @Column private String playlistName; - + + @Column private String url; + + @Enumerated(EnumType.STRING) private StatusEnum status; @ManyToMany diff --git a/src/main/java/com/example/video_downloader/entity/Video.java b/src/main/java/com/example/video_downloader/entity/Video.java index 7988f10..1a541af 100644 --- a/src/main/java/com/example/video_downloader/entity/Video.java +++ b/src/main/java/com/example/video_downloader/entity/Video.java @@ -4,6 +4,9 @@ import jakarta.persistence.*; import lombok.Data; import lombok.ToString; +import java.util.ArrayList; +import java.util.List; + @Data @ToString @Entity @@ -22,9 +25,13 @@ public class Video { private String fullPath; - @ManyToOne - @JoinColumn(name = "playlist_id") - private Playlist playlist; + @ManyToMany + @JoinTable( + name = "video_playlist", + joinColumns = @JoinColumn(name = "video_id"), + inverseJoinColumns = @JoinColumn(name = "playlist_id") + ) + private List playlist = new ArrayList<>(); @OneToOne @JoinColumn(name = "creator_id") diff --git a/src/main/java/com/example/video_downloader/repositories/PlaylistRepository.java b/src/main/java/com/example/video_downloader/repositories/PlaylistRepository.java index a4d2352..00557c8 100644 --- a/src/main/java/com/example/video_downloader/repositories/PlaylistRepository.java +++ b/src/main/java/com/example/video_downloader/repositories/PlaylistRepository.java @@ -1,7 +1,11 @@ package com.example.video_downloader.repositories; import com.example.video_downloader.entity.Playlist; +import com.example.video_downloader.entity.StatusEnum; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface PlaylistRepository extends JpaRepository { + List findByStatus(StatusEnum status); } diff --git a/src/main/java/com/example/video_downloader/services/PlaylistService.java b/src/main/java/com/example/video_downloader/services/PlaylistService.java index 6923df8..aa20e8d 100644 --- a/src/main/java/com/example/video_downloader/services/PlaylistService.java +++ b/src/main/java/com/example/video_downloader/services/PlaylistService.java @@ -7,6 +7,7 @@ import com.example.video_downloader.repositories.PlaylistRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.security.InvalidParameterException; import java.util.List; @Service @@ -16,14 +17,13 @@ public class PlaylistService { private PlaylistRepository playlistRepository; public Playlist saveNewPlaylist(SaveNewPlaylistRequest request){ + if(!request.getUrl().contains("list")) throw new InvalidParameterException(); Playlist playlist = new Playlist(); - playlist.setStatus(StatusEnum.NEW); playlist.setPlaylistName(request.getPlaylistName()); playlist.setUrl(request.getUrl()); playlistRepository.save(playlist); return playlist; - } public List getAllPlaylists(){ diff --git a/src/main/java/com/example/video_downloader/services/ProcessService.java b/src/main/java/com/example/video_downloader/services/ProcessService.java index f1261a6..2d3075f 100644 --- a/src/main/java/com/example/video_downloader/services/ProcessService.java +++ b/src/main/java/com/example/video_downloader/services/ProcessService.java @@ -2,17 +2,23 @@ package com.example.video_downloader.services; import org.springframework.stereotype.Service; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; @Service public class ProcessService { - public void execute(String... command) throws InterruptedException, IOException { + public String execute(String... command) throws InterruptedException, IOException { ProcessBuilder builder = new ProcessBuilder(command); - builder.redirectOutput(ProcessBuilder.Redirect.INHERIT); - builder.redirectError(ProcessBuilder.Redirect.INHERIT); +// builder.redirectOutput(ProcessBuilder.Redirect.INHERIT); +// builder.redirectError(ProcessBuilder.Redirect.INHERIT); Process process = builder.start(); + String res = new String(process.getInputStream().readAllBytes()); + int exitCode = process.waitFor(); + return res; } diff --git a/src/main/java/com/example/video_downloader/services/VideoService.java b/src/main/java/com/example/video_downloader/services/VideoService.java index 9be661d..7b25bdd 100644 --- a/src/main/java/com/example/video_downloader/services/VideoService.java +++ b/src/main/java/com/example/video_downloader/services/VideoService.java @@ -7,8 +7,8 @@ import com.example.video_downloader.repositories.VideoRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.security.InvalidParameterException; import java.util.List; -import java.util.Optional; @Service public class VideoService { @@ -16,7 +16,8 @@ public class VideoService { @Autowired private VideoRepository videoRepository; - public Video saveNewVideo(SaveNewVideoRequest request){ + public Video saveNewVideo(SaveNewVideoRequest request) { + if (request.getUrl().contains("list")) throw new InvalidParameterException(""); Video video = new Video(); video.setStatus(StatusEnum.NEW); video.setUrl(request.getUrl()); diff --git a/src/main/java/com/example/video_downloader/services/YTDLPService.java b/src/main/java/com/example/video_downloader/services/YTDLPService.java index 57874b4..c067321 100644 --- a/src/main/java/com/example/video_downloader/services/YTDLPService.java +++ b/src/main/java/com/example/video_downloader/services/YTDLPService.java @@ -1,9 +1,10 @@ package com.example.video_downloader.services; +import com.example.video_downloader.entity.Playlist; import com.example.video_downloader.entity.StatusEnum; import com.example.video_downloader.entity.Video; +import com.example.video_downloader.repositories.PlaylistRepository; import com.example.video_downloader.repositories.VideoRepository; -import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.HttpClientErrorException; @@ -23,31 +24,54 @@ public class YTDLPService { @Autowired private PlaylistService playlistService; + @Autowired + private PlaylistRepository playlistRepository; + @Autowired private ProcessService processService; + + public void processPlaylist() throws IOException, InterruptedException { + List playlists = playlistRepository.findByStatus(StatusEnum.NEW); + + for(Playlist playlist : playlists) { + String urls = processService.execute("yt-dlp", "--flat-playlist", "--print", "webpage_url", playlist.getUrl()); + for(String url : urls.split("\\n")){ + Video video = new Video(); + video.setUrl(url); + video.setStatus(StatusEnum.NEW); + video.getPlaylist().add(playlist); + videoRepository.save(video); + } + + } + + } + public void validateVideos() throws HttpClientErrorException, IOException, InterruptedException { List