From 3d675cfa1b177f5142ed8aeeec3017c1b5c791ce Mon Sep 17 00:00:00 2001 From: weiyachao <13526234727@126.com> Date: Thu, 28 Sep 2023 15:04:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=8C=E6=9B=B2B=E6=96=B9=E6=A1=88=E7=BC=96?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qiuguo/iot/third/resp/SearchResponse.java | 35 ++++++ .../qiuguo/iot/third/resp/SingerResponse.java | 32 ++++++ .../iot/third/resp/SingerSongsResponse.java | 27 +++++ .../iot/third/resp/SongInfoResponse.java | 31 +++++ .../iot/third/service/MusicService.java | 106 ++++++++++++++++++ .../user/api/controller/MusicController.java | 35 ++++++ 6 files changed, 266 insertions(+) create mode 100644 iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SearchResponse.java create mode 100644 iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SingerResponse.java create mode 100644 iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SingerSongsResponse.java create mode 100644 iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SongInfoResponse.java create mode 100644 iot-common/iot-third/src/main/java/com/qiuguo/iot/third/service/MusicService.java create mode 100644 iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/MusicController.java diff --git a/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SearchResponse.java b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SearchResponse.java new file mode 100644 index 0000000..a71c205 --- /dev/null +++ b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SearchResponse.java @@ -0,0 +1,35 @@ +package com.qiuguo.iot.third.resp; + +import java.util.List; +import lombok.Data; + +/** + * XXX + * + * @author weiyachao + * @since 2023/9/28 14:03 + */ +@Data +public class SearchResponse { + + private Result result; + + private Integer code; + + + + @Data + public static class Result{ + + private List songs; + } + + @Data + public static class Song{ + + private String id; + + private String name; + } + +} diff --git a/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SingerResponse.java b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SingerResponse.java new file mode 100644 index 0000000..55117ae --- /dev/null +++ b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SingerResponse.java @@ -0,0 +1,32 @@ +package com.qiuguo.iot.third.resp; + +import java.util.List; +import lombok.Data; + +/** + * XXX + * + * @author weiyachao + * @since 2023/9/28 14:26 + */ +@Data +public class SingerResponse { + + private Result result; + + private Integer code; + + @Data + public static class Result{ + + private List artists; + + @Data + public static class Artist{ + + private String id; + + } + } + +} diff --git a/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SingerSongsResponse.java b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SingerSongsResponse.java new file mode 100644 index 0000000..287ac19 --- /dev/null +++ b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SingerSongsResponse.java @@ -0,0 +1,27 @@ +package com.qiuguo.iot.third.resp; + +import java.util.List; +import lombok.Data; + +/** + * XXX + * + * @author weiyachao + * @since 2023/9/28 14:33 + */ +@Data +public class SingerSongsResponse { + + private Integer code; + + private List songs; + + @Data + public static class Song{ + + private String id; + + private String name; + } + +} diff --git a/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SongInfoResponse.java b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SongInfoResponse.java new file mode 100644 index 0000000..095a02d --- /dev/null +++ b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/resp/SongInfoResponse.java @@ -0,0 +1,31 @@ +package com.qiuguo.iot.third.resp; + +import java.util.List; +import lombok.Data; + +/** + * XXX + * + * @author weiyachao + * @since 2023/9/28 14:12 + */ +@Data +public class SongInfoResponse { + + private List data; + + private Integer code; + + @Data + public static class ResultSong{ + + private String id; + + private String url; + + private String name; + + + } + +} diff --git a/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/service/MusicService.java b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/service/MusicService.java new file mode 100644 index 0000000..80e9490 --- /dev/null +++ b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/service/MusicService.java @@ -0,0 +1,106 @@ +package com.qiuguo.iot.third.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.qiuguo.iot.third.resp.SingerResponse; +import com.qiuguo.iot.third.resp.SingerSongsResponse; +import com.qiuguo.iot.third.resp.SongInfoResponse; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; +import com.qiuguo.iot.third.resp.SearchResponse; + +import static org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED_VALUE; +import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE; + +/** + * XXX + * + * @author weiyachao + * @since 2023/9/28 10:40 + */ +@Service +@Slf4j +public class MusicService { + + // 网易云音乐 + public Mono> searchMusic(String keyword, Integer type) { + if (ObjectUtils.isEmpty(type)) { + type = 1; + } + if (ObjectUtils.isEmpty(keyword)) { + keyword = "追梦赤子心"; + } + WebClient build = WebClient.builder().defaultHeader(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON_VALUE).build(); + String baseUrl = "http://bilibiliz.cn:8031"; + if (type == 1) { + return build.get().uri(baseUrl.concat("/search?keywords=").concat(keyword).concat("&limit=10")).retrieve() + .bodyToMono(SearchResponse.class).flatMap(res -> { + if (!Objects.equals(res.getCode(), 200)) { + return Mono.empty(); + } + String ids = res.getResult().getSongs().stream().map(SearchResponse.Song::getId) + .collect(Collectors.joining(",")); + Map songMap = res.getResult().getSongs().stream() + .collect(Collectors.toMap(SearchResponse.Song::getId, SearchResponse.Song::getName)); + + return build.get().uri(baseUrl.concat("/song/url?id=").concat(ids)).retrieve() + .bodyToMono(SongInfoResponse.class).flatMap(song -> { + if (Objects.equals(200, song.getCode()) && song.getData().size() > 0) { + + List data = song.getData(); + for (SongInfoResponse.ResultSong datum : data) { + datum.setName(songMap.get(datum.getId())); + } + return Mono.just(data); + } + return Mono.empty(); + }); + }); + } else { + return build.get().uri(baseUrl.concat("/search?keywords=").concat(keyword).concat("&type=100")).retrieve() + .bodyToMono(SingerResponse.class).flatMap(res -> { + if (!Objects.equals(res.getCode(), 200) && res.getResult().getArtists().size() == 0) { + return Mono.empty(); + } + String id = res.getResult().getArtists().get(0).getId(); + return build.get().uri(baseUrl.concat("/artist/top/song?id=").concat(id)).retrieve() + .bodyToMono(SingerSongsResponse.class).flatMap(song -> { + if (Objects.equals(200, song.getCode()) && song.getSongs().size() > 0) { + String ids = song.getSongs().stream().limit(10) + .map(SingerSongsResponse.Song::getId).collect(Collectors.joining(",")); + Map songMap = song.getSongs().stream() + .collect(Collectors.toMap(SingerSongsResponse.Song::getId, + Function.identity())); + return build.get().uri(baseUrl.concat("/song/url?id=").concat(ids)).retrieve() + .bodyToMono(SongInfoResponse.class).flatMap(so -> { + if (Objects.equals(200, song.getCode()) + && so.getData().size() > 0) { + List data = so.getData(); + for (SongInfoResponse.ResultSong datum : data) { + datum.setName(songMap.get(datum.getId()).getName()); + } + return Mono.just(data); + } + return Mono.empty(); + }); + } + return Mono.empty(); + }); + }); + } + + } + +} + diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/MusicController.java b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/MusicController.java new file mode 100644 index 0000000..b3100e0 --- /dev/null +++ b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/MusicController.java @@ -0,0 +1,35 @@ +package com.qiuguo.iot.user.api.controller; + +import com.alibaba.fastjson.JSONArray; +import com.qiuguo.iot.third.resp.SongInfoResponse; +import com.qiuguo.iot.third.service.MusicService; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +/** + * XXX + * + * @author weiyachao + * @since 2023/9/28 12:28 + */ +@RestController +@RequestMapping("/music") +public class MusicController { + + @Autowired + private MusicService musicService; + + @GetMapping("/search") + public Mono> search(String name, + @RequestParam(required = false, defaultValue = "1") Integer type) { + + return musicService.searchMusic(name,type); + } + + +}