diff --git a/src/main/java/top/baogutang/music/client/KuGouMusicClient.java b/src/main/java/top/baogutang/music/client/KuGouMusicClient.java new file mode 100644 index 0000000..b8e16db --- /dev/null +++ b/src/main/java/top/baogutang/music/client/KuGouMusicClient.java @@ -0,0 +1,238 @@ +package top.baogutang.music.client; + +import com.fasterxml.jackson.core.type.TypeReference; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import top.baogutang.music.annos.ChannelInfo; +import top.baogutang.music.dao.entity.MusicDownloadRecordEntity; +import top.baogutang.music.dao.entity.MusicRecordEntity; +import top.baogutang.music.domain.req.search.MusicSearchReq; +import top.baogutang.music.domain.res.download.MusicDownloadRes; +import top.baogutang.music.domain.res.search.*; +import top.baogutang.music.enums.ChannelEnum; +import top.baogutang.music.enums.SearchTypeEnum; +import top.baogutang.music.exceptions.BusinessException; +import top.baogutang.music.properties.KuGouMusicProperties; +import top.baogutang.music.service.IMusicDownloadRecordService; +import top.baogutang.music.service.IMusicRecordService; +import top.baogutang.music.utils.OkHttpUtil; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * + * @description: + * + * @author: N1KO + * @date: 2024/12/16 : 18:24 + */ +@Slf4j +@Component +@ChannelInfo(ChannelEnum.KU_GOU_MUSIC) +public class KuGouMusicClient implements ChannelClient { + + @Resource + private KuGouMusicProperties kuGouMusicProperties; + + @Resource + private IMusicRecordService musicRecordService; + + @Resource + private IMusicDownloadRecordService musicDownloadRecordService; + + @Override + public MusicSearchRes search(MusicSearchReq req) { + Integer pageNo = (req.getOffset() / req.getLimit()) + 1; + SearchTypeEnum searchType = SearchTypeEnum.parseKuGouMusicCode(req.getType()); + if (searchType == null) { + throw new BusinessException("不支持的搜索类型"); + } + String searchUrl = String.format(kuGouMusicProperties.getQueryBaseUrl(), req.getKeywords(), pageNo, req.getLimit(), searchType.getKuGouMusicCode()); + + switch (searchType) { + case SONG: + return searchSong(searchUrl, pageNo, req.getLimit()); + case ALBUM: + return searchAlbum(searchUrl, pageNo, req.getLimit()); + case PLAYLIST: + return searchPlayList(searchUrl, pageNo, req.getLimit()); + case SINGER: + return searchSinger(searchUrl, pageNo, req.getLimit()); + default: + throw new BusinessException("不支持的搜索类型"); + } + } + + private MusicSearchRes searchSinger(String searchUrl, Integer pageNo, Integer pageSize) { + KuGouMusicSearchCommonRes> kuGouMusicSearchCommonRes = OkHttpUtil.get(searchUrl, null, null, new TypeReference<>() { + }); + if (Objects.isNull(kuGouMusicSearchCommonRes) || Objects.isNull(kuGouMusicSearchCommonRes.getData()) || kuGouMusicSearchCommonRes.getData().getTotal() <= 0) { + return null; + } + MusicSearchRes musicSearchRes = new MusicSearchRes(); + musicSearchRes.setCode(200); + MusicSearchRes.SearchResult searchResult = new MusicSearchRes.SearchResult(); + searchResult.setHasMore(pageNo * pageSize < kuGouMusicSearchCommonRes.getData().getTotal()); + List artistList = kuGouMusicSearchCommonRes.getData().getLists().stream() + .map(a -> { + MusicSearchRes.Artist artist = new MusicSearchRes.Artist(); + artist.setId(a.getAuthorId()); + artist.setName(a.getAuthorName()); + artist.setPicUrl(a.getAvatar()); + return artist; + }) + .collect(Collectors.toList()); + searchResult.setArtists(artistList); + musicSearchRes.setResult(searchResult); + return musicSearchRes; + } + + private MusicSearchRes searchPlayList(String searchUrl, Integer pageNo, Integer pageSize) { + KuGouMusicSearchCommonRes> kuGouMusicSearchCommonRes = OkHttpUtil.get(searchUrl, null, null, new TypeReference<>() { + }); + if (Objects.isNull(kuGouMusicSearchCommonRes) || Objects.isNull(kuGouMusicSearchCommonRes.getData()) || kuGouMusicSearchCommonRes.getData().getTotal() <= 0) { + return null; + } + MusicSearchRes musicSearchRes = new MusicSearchRes(); + musicSearchRes.setCode(200); + MusicSearchRes.SearchResult searchResult = new MusicSearchRes.SearchResult(); + searchResult.setHasMore(pageNo * pageSize < kuGouMusicSearchCommonRes.getData().getTotal()); + List playLists = kuGouMusicSearchCommonRes.getData().getLists().stream() + .map(p -> { + MusicSearchRes.PlayList playList = new MusicSearchRes.PlayList(); + playList.setId(p.getGid()); + playList.setName(p.getSpecialname()); + playList.setCoverImgUrl(p.getImg()); + return playList; + }) + .collect(Collectors.toList()); + searchResult.setPlaylists(playLists); + musicSearchRes.setResult(searchResult); + return musicSearchRes; + + } + + private MusicSearchRes searchAlbum(String searchUrl, Integer pageNo, Integer pageSize) { + KuGouMusicSearchCommonRes> kuGouMusicSearchCommonRes = OkHttpUtil.get(searchUrl, null, null, new TypeReference<>() { + }); + if (Objects.isNull(kuGouMusicSearchCommonRes) || Objects.isNull(kuGouMusicSearchCommonRes.getData()) || kuGouMusicSearchCommonRes.getData().getTotal() <= 0) { + return null; + } + MusicSearchRes musicSearchRes = new MusicSearchRes(); + musicSearchRes.setCode(200); + MusicSearchRes.SearchResult searchResult = new MusicSearchRes.SearchResult(); + searchResult.setHasMore(pageNo * pageSize < kuGouMusicSearchCommonRes.getData().getTotal()); + List albumList = kuGouMusicSearchCommonRes.getData().getLists().stream() + .map(a -> { + MusicSearchRes.Album album = new MusicSearchRes.Album(); + album.setId(a.getAlbumId()); + album.setName(a.getAlbumName()); + album.setBlurPicUrl(a.getImg()); + return album; + }) + .collect(Collectors.toList()); + searchResult.setAlbums(albumList); + musicSearchRes.setResult(searchResult); + return musicSearchRes; + } + + private MusicSearchRes searchSong(String searchUrl, Integer pageNo, Integer pageSize) { + KuGouMusicSearchCommonRes> kuGouMusicSearchCommonRes = OkHttpUtil.get(searchUrl, null, null, new TypeReference<>() { + }); + if (Objects.isNull(kuGouMusicSearchCommonRes) || Objects.isNull(kuGouMusicSearchCommonRes.getData()) || kuGouMusicSearchCommonRes.getData().getTotal() <= 0) { + return null; + } + MusicSearchRes musicSearchRes = new MusicSearchRes(); + musicSearchRes.setCode(200); + MusicSearchRes.SearchResult searchResult = new MusicSearchRes.SearchResult(); + searchResult.setHasMore(pageNo * pageSize < kuGouMusicSearchCommonRes.getData().getTotal()); + List songList = kuGouMusicSearchCommonRes.getData().getLists().stream() + .map(s -> { + MusicSearchRes.Song song = new MusicSearchRes.Song(); + song.setId(s.getFileHash()); + song.setName(s.getSongName()); + List artistList = s.getSingers().stream() + .map(singer -> { + MusicSearchRes.Artist artist = new MusicSearchRes.Artist(); + artist.setId(singer.getId()); + artist.setName(singer.getName()); + return artist; + }) + .collect(Collectors.toList()); + song.setArtists(artistList); + MusicSearchRes.Album album = new MusicSearchRes.Album(); + album.setId(s.getAlbumId()); + album.setName(s.getAlbumName()); + song.setAlbum(album); + return song; + }) + .collect(Collectors.toList()); + searchResult.setSongs(songList); + musicSearchRes.setResult(searchResult); + return musicSearchRes; + } + + @Override + public MusicPlaylistRes playlist(String id) { + return null; + } + + @Override + public MusicDetailRes detail(String id) { + return null; + } + + @Override + public MusicAlbumRes album(String id) { + return null; + } + + @Override + public MusicArtistRes artist(String id) { + return null; + } + + @Override + public MusicDownloadRes download(String id) { + return null; + } + + @Override + public void saveMusic(MusicDownloadRes res) { + + } + + @Override + public void processFile(MusicDownloadRes res) throws IOException { + + } + + @Override + public MusicRecordEntity queryByPlatform(String id) { + return null; + } + + @Override + public String getDownloadBasePath() { + return ""; + } + + @Override + public void saveDownloadRecord(Long userId, String batchNo, String musicId) { + + } + + @Override + public List queryDownloadRecord(String batchNo) { + return List.of(); + } + + @Override + public List queryMusicByPlatformIdList(List platformIdList) { + return List.of(); + } +} diff --git a/src/main/java/top/baogutang/music/domain/res/search/KuGouMusicSearchCommonRes.java b/src/main/java/top/baogutang/music/domain/res/search/KuGouMusicSearchCommonRes.java new file mode 100644 index 0000000..e1641cc --- /dev/null +++ b/src/main/java/top/baogutang/music/domain/res/search/KuGouMusicSearchCommonRes.java @@ -0,0 +1,122 @@ +package top.baogutang.music.domain.res.search; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * + * @description: + * + * @author: N1KO + * @date: 2024/12/16 : 18:33 + */ +@Data +public class KuGouMusicSearchCommonRes implements Serializable { + + private static final long serialVersionUID = -3851575429347578104L; + + private Integer status; + + @JsonProperty("error_code") + private Integer errorCode; + + @JsonProperty("error_msg") + private String errorMsg; + + private T data; + + @Data + public static class PageData implements Serializable { + + private static final long serialVersionUID = 1606319973451240398L; + + private Integer page; + + @JsonProperty("pagesize") + private Integer pageSize; + + private Integer total; + + private List lists; + } + + @Data + public static class Song implements Serializable { + + private static final long serialVersionUID = 564075626053778101L; + + @JsonProperty("FileHash") + private String fileHash; + + @JsonProperty("SongName") + private String songName; + + @JsonProperty("AlbumID") + private String albumId; + + @JsonProperty("AlbumName") + private String albumName; + + @JsonProperty("Singers") + private List singers; + + } + + @Data + public static class Author implements Serializable { + + private static final long serialVersionUID = -5222912661645405260L; + + @JsonProperty("AuthorId") + private String authorId; + + @JsonProperty("AuthorName") + private String authorName; + + @JsonProperty("Avatar") + private String avatar; + } + + @Data + public static class Playlist implements Serializable { + + private static final long serialVersionUID = -1508270737885641882L; + + @JsonProperty("gid") + private String gid; + + @JsonProperty("specialname") + private String specialname; + + @JsonProperty("img") + private String img; + } + + @Data + public static class Album implements Serializable { + + private static final long serialVersionUID = 8644829843407879987L; + + @JsonProperty("albumid") + private String albumId; + + @JsonProperty("albumname") + private String albumName; + + @JsonProperty("img") + private String img; + } + + @Data + public static class Singer implements Serializable { + + private static final long serialVersionUID = -5222912661645405260L; + + private String id; + + private String name; + } +} diff --git a/src/main/java/top/baogutang/music/enums/ChannelEnum.java b/src/main/java/top/baogutang/music/enums/ChannelEnum.java index ad0ac93..eece060 100644 --- a/src/main/java/top/baogutang/music/enums/ChannelEnum.java +++ b/src/main/java/top/baogutang/music/enums/ChannelEnum.java @@ -18,7 +18,7 @@ public enum ChannelEnum { KU_GOU_MUSIC(2, "酷狗音乐"), - KU_WO_MUSIC(3, "酷我音乐"), +// KU_WO_MUSIC(3, "酷我音乐"), // CUS_MUSIC(4, "自定义音乐"), diff --git a/src/main/java/top/baogutang/music/enums/SearchTypeEnum.java b/src/main/java/top/baogutang/music/enums/SearchTypeEnum.java index fe9b23f..d94001c 100644 --- a/src/main/java/top/baogutang/music/enums/SearchTypeEnum.java +++ b/src/main/java/top/baogutang/music/enums/SearchTypeEnum.java @@ -27,10 +27,10 @@ public enum SearchTypeEnum { * 1018:综合, * 2000:声音(搜索声音返回字段格式会不一样) */ - SONG(1, 0, "单曲"), - ALBUM(10, 8, "专辑"), - SINGER(100, 9, "歌手"), - PLAYLIST(1000, 2, "歌单"), + SONG(1, 0, "song", "单曲"), + ALBUM(10, 8, "album", "专辑"), + SINGER(100, 9, "author", "歌手"), + PLAYLIST(1000, 2, "special", "歌单"), ; @@ -39,11 +39,14 @@ public enum SearchTypeEnum { private final Integer qqMusicCode; + private final String kuGouMusicCode; + private final String desc; - SearchTypeEnum(Integer code, Integer qqMusicCode, String desc) { + SearchTypeEnum(Integer code, Integer qqMusicCode, String kuGouMusicCode, String desc) { this.code = code; this.qqMusicCode = qqMusicCode; + this.kuGouMusicCode = kuGouMusicCode; this.desc = desc; } @@ -53,4 +56,11 @@ public enum SearchTypeEnum { .findFirst() .orElse(null); } + + public static SearchTypeEnum parseKuGouMusicCode(Integer type) { + return Arrays.stream(SearchTypeEnum.values()) + .filter(searchType -> Objects.equals(searchType.getCode(), type)) + .findFirst() + .orElse(null); + } } diff --git a/src/main/java/top/baogutang/music/properties/KuGouMusicProperties.java b/src/main/java/top/baogutang/music/properties/KuGouMusicProperties.java new file mode 100644 index 0000000..db8d450 --- /dev/null +++ b/src/main/java/top/baogutang/music/properties/KuGouMusicProperties.java @@ -0,0 +1,30 @@ +package top.baogutang.music.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * + * @description: + * + * @author: N1KO + * @date: 2024/12/16 : 18:22 + */ +@Data +@Component +@ConfigurationProperties(prefix = "baogutang.kugou-music") +public class KuGouMusicProperties { + + private String queryBaseUrl; + + private String playlistBaseUrl; + + private String albumBaseUrl; + + private String artistBaseUrl; + + private String downloadBaseUrl; + + private String downloadPath; +} diff --git a/src/main/java/top/baogutang/music/service/IKuGouMusicService.java b/src/main/java/top/baogutang/music/service/IKuGouMusicService.java new file mode 100644 index 0000000..86a9383 --- /dev/null +++ b/src/main/java/top/baogutang/music/service/IKuGouMusicService.java @@ -0,0 +1,20 @@ +package top.baogutang.music.service; + +import org.springframework.stereotype.Service; +import top.baogutang.music.enums.ChannelEnum; + +/** + * + * @description: + * + * @author: N1KO + * @date: 2024/12/16 : 18:25 + */ +@Service +public class IKuGouMusicService extends AbstractMusicService { + + @Override + public ChannelEnum getChannelEnum() { + return ChannelEnum.KU_GOU_MUSIC; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3b4a04f..dad2508 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -59,5 +59,13 @@ baogutang: download-path: /downloads/music # download-path: /Users/nikooh/Desktop/downloads/music + kugou-music: + query-base-url: http://117.72.78.133:5177/search?keywords=%s&page=%d&pagesize=%d&type=%s + playlist-base-url: http://117.72.78.133:5175/songlist?id=%s + album-base-url: http://117.72.78.133:5175/album/songs?albummid=%s + download-base-url: http://117.72.78.133:5176/song?url=https://y.qq.com/n/ryqq/songDetail/%s + download-path: /downloads/music +# download-path: /Users/nikooh/Desktop/downloads/music +