AudioServiceImpl.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. package cn.efunbox.audio.impl;
  2. import cn.efunbox.audio.consts.MediaType;
  3. import cn.efunbox.audio.entity.Album;
  4. import cn.efunbox.audio.entity.Audio;
  5. import cn.efunbox.audio.page.OnePage;
  6. import cn.efunbox.audio.repository.AlbumRepo;
  7. import cn.efunbox.audio.repository.AudioRepo;
  8. import cn.efunbox.audio.repository.AudioRepoImpl;
  9. import cn.efunbox.audio.service.AudioService;
  10. import cn.efunbox.audio.utils.ApiResult;
  11. import cn.efunbox.audio.vo.SearchVO;
  12. import javazoom.jl.decoder.Bitstream;
  13. import javazoom.jl.decoder.Header;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.apache.commons.lang3.StringUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.beans.factory.annotation.Value;
  18. import org.springframework.data.domain.Page;
  19. import org.springframework.data.domain.PageRequest;
  20. import org.springframework.data.domain.Pageable;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.util.CollectionUtils;
  23. import java.io.BufferedInputStream;
  24. import java.math.BigInteger;
  25. import java.net.URL;
  26. import java.net.URLConnection;
  27. import java.util.ArrayList;
  28. import java.util.List;
  29. import java.util.Map;
  30. import java.util.Objects;
  31. import java.util.stream.Collectors;
  32. /**
  33. * Created by yao on 17-9-26.
  34. */
  35. @Slf4j
  36. @Service
  37. public class AudioServiceImpl implements AudioService {
  38. @Autowired
  39. AudioRepo audioRepo;
  40. @Autowired
  41. AlbumRepo albumRepo;
  42. @Autowired
  43. AudioRepoImpl audioRepoImpl;
  44. @Value("${efunbox.oss.img.url}")
  45. private String imgURL;
  46. @Override
  47. public Audio GetOne(Long id){
  48. Audio audio = audioRepo.findById(id);
  49. return audio;
  50. }
  51. @Override
  52. public Page<Audio> SearchAll(int mediaType, int page, int size){
  53. if(size<=0)
  54. size = 50;
  55. Pageable pageable = new PageRequest(page, size);
  56. Page<Audio> list = null;
  57. if(mediaType== MediaType.AUDIO.getCode() || mediaType==MediaType.VIDEO.getCode())
  58. list = audioRepo.findByMediaType(mediaType, pageable);
  59. else
  60. list = audioRepo.findAll(pageable);
  61. fillAlbum(list.getContent());
  62. return list;
  63. }
  64. private void fillAlbum(List<Audio> list) {
  65. List<BigInteger> albumIds = new ArrayList<>();
  66. list.stream().forEach(audio -> albumIds.add(audio.getAlbumId()));
  67. List<Album> albumList = albumRepo.findByIdIn(albumIds);
  68. if (CollectionUtils.isEmpty(albumList)) {
  69. return;
  70. }
  71. Map<BigInteger, Album> albumMap = albumList.stream().collect(Collectors.toMap(Album::getId, album -> album));
  72. list.stream().forEach(audio -> {
  73. Album album = albumMap.get(audio.getAlbumId());
  74. if (Objects.nonNull(album)) {
  75. audio.setAlbum(album.getName());
  76. if (StringUtils.isNotBlank(album.getImage())) {
  77. audio.setAlbumImage(imgURL + album.getImage());
  78. }
  79. }
  80. });
  81. }
  82. @Override
  83. public Page<Audio> SearchByIdGroup(int mediaType, Long idGroup, int page, int size){
  84. if(size<=0)
  85. size = 50;
  86. Pageable pageable = new PageRequest(page, size);
  87. Page<Audio> list = null;
  88. if(mediaType== MediaType.AUDIO.getCode() || mediaType==MediaType.VIDEO.getCode())
  89. list = audioRepo.findByMediaTypeAndIdGroup(mediaType, idGroup, pageable);
  90. else
  91. list = audioRepo.findByIdGroup(idGroup, pageable);
  92. fillAlbum(list.getContent());
  93. return list;
  94. }
  95. @Override
  96. public List<Audio> SearchByName(int mediaType, String name){
  97. if(name==null || name.isEmpty())
  98. return null;
  99. List<Audio> list = null;
  100. if(mediaType== MediaType.AUDIO.getCode() || mediaType==MediaType.VIDEO.getCode())
  101. list = audioRepo.findByMediaTypeAndName(mediaType, name);
  102. else
  103. list = audioRepo.findByName(name);
  104. // System.out.println("list1:"+list.toString());
  105. if(CollectionUtils.isEmpty(list)){
  106. list = audioRepo.findByNameLike(name);
  107. System.out.println("list:"+list.toString());
  108. }
  109. fillAlbum(list);
  110. // System.out.println("list2:"+list.toString());
  111. return list;
  112. }
  113. @Override
  114. public List<Audio> SearchByAlbum(int mediaType, String album){
  115. if(album==null || album.isEmpty())
  116. return null;
  117. List<BigInteger> albumIds = albumRepo.findIdsByNameLike(album);
  118. List<Audio> list = null;
  119. if(mediaType== MediaType.AUDIO.getCode() || mediaType==MediaType.VIDEO.getCode())
  120. list = audioRepo.findByMediaTypeAndAlbumIdIn(mediaType, albumIds);
  121. else
  122. list = audioRepo.findByAlbumIdIn(albumIds);
  123. fillAlbum(list);
  124. return list;
  125. }
  126. @Override
  127. public List<Audio> SearchByNameAlbum(int mediaType, String name, String album){
  128. if(name==null || name.isEmpty()
  129. || album==null || album.isEmpty())
  130. return null;
  131. List<BigInteger> albumIds = albumRepo.findIdsByNameLike(album);
  132. List<Audio> list = null;
  133. if(mediaType== MediaType.AUDIO.getCode() || mediaType==MediaType.VIDEO.getCode())
  134. list = audioRepo.findByMediaTypeAndNameAndAlbumIdIn(mediaType, name, albumIds);
  135. else
  136. list = audioRepo.findByNameAndAlbumIdIn(name, albumIds);
  137. if(CollectionUtils.isEmpty(list))
  138. list = audioRepo.findByNameLikeAndAlbumIdIn(name, albumIds);
  139. fillAlbum(list);
  140. return list;
  141. }
  142. @Override
  143. public Audio Insert(Audio audio){
  144. Audio a = audioRepo.save(audio);
  145. return a;
  146. }
  147. @Override
  148. public void Delete(Long id){
  149. audioRepo.delete(id);
  150. }
  151. @Override
  152. public OnePage<Audio> pageList(Audio audio, Integer pageNo, Integer pageSize) {
  153. long count = audioRepo.count(audio);
  154. OnePage onePage = new OnePage(count,pageNo,pageSize);
  155. if (count == 0) {
  156. return onePage;
  157. }
  158. List<Audio> audios = audioRepo.find(audio, onePage.getStart(),onePage.getPageSize());
  159. fillAlbum(audios);
  160. onePage.setList(audios);
  161. return onePage;
  162. }
  163. @Override
  164. public OnePage<Audio> searchList(SearchVO searchVO) {
  165. if (StringUtils.isNotBlank(searchVO.getAlbum())) {
  166. List<BigInteger> albumIds = albumRepo.findIdsByNameLike(searchVO.getAlbum());
  167. if (CollectionUtils.isEmpty(albumIds)) {
  168. return new OnePage(0L,searchVO.getPageNo(),searchVO.getPageSize());
  169. }
  170. searchVO.setIdAlbums(albumIds);
  171. }
  172. Long count = audioRepoImpl.count(searchVO);
  173. if (Objects.isNull(count)) {
  174. count = 0L;
  175. }
  176. OnePage<Audio> onePage = new OnePage(count,searchVO.getPageNo(),searchVO.getPageSize());
  177. if (count == 0) {
  178. return onePage;
  179. }
  180. List<Audio> audioList = audioRepoImpl.findAudio(searchVO, onePage.getStart(), onePage.getPageSize());
  181. fillAlbum(audioList);
  182. onePage.setList(audioList);
  183. return onePage;
  184. }
  185. @Override
  186. public Audio getAudioInfo(Long id) {
  187. if (Objects.isNull(id) || id < 1) {
  188. return null;
  189. }
  190. Audio audio = audioRepo.find(id);
  191. if (Objects.isNull(audio)) {
  192. return null;
  193. }
  194. Album album = albumRepo.find(audio.getAlbumId());
  195. if (Objects.nonNull(album)) {
  196. audio.setAlbum(album.getName());
  197. if (StringUtils.isNotBlank(album.getImage())) {
  198. audio.setAlbumImage(imgURL + album.getImage());
  199. }
  200. }
  201. return audio;
  202. }
  203. @Override
  204. public ApiResult countTime() {
  205. //TODO
  206. List<Audio> allAudio = audioRepo.findAll();
  207. List<Audio> newAudioList = new ArrayList<>();
  208. long startTime = System.currentTimeMillis();
  209. allAudio.forEach(audio -> {
  210. long timeLength = getMicrosecondLength(audio.getUrl());
  211. audio.setTotalTime(timeLength);
  212. newAudioList.add(audio);
  213. });
  214. List<Audio> update = audioRepo.update(newAudioList);
  215. System.out.println("耗时 :" + (System.currentTimeMillis() - startTime));
  216. return ApiResult.ok(update.size());
  217. }
  218. /**
  219. * 获取音频文件时长
  220. *
  221. * @param filePath wav文件路径,支持本地和网络HTTP路径
  222. * @return 时长/毫秒,可 /1000D 得到秒
  223. * @throws Exception
  224. */
  225. public static long getMicrosecondLength(String filePath) {
  226. long countTime = 0;
  227. try {
  228. URL urlfile = new URL(filePath);
  229. //File file = new File("C:\\music\\test2.mp3");
  230. //URL urlfile = file.toURI().toURL();
  231. URLConnection con = urlfile.openConnection();
  232. int b = con.getContentLength();// 得到音乐文件的总长度
  233. BufferedInputStream bis = new BufferedInputStream(con.getInputStream());
  234. Bitstream bt = new Bitstream(bis);
  235. Header h = bt.readFrame();
  236. int time = (int) h.total_ms(b);
  237. // System.out.println(time / 1000);
  238. countTime = time/1000;
  239. } catch (Exception e) {
  240. // e.printStackTrace();
  241. log.error("get time is error! url : {}" ,filePath);
  242. } finally {
  243. return countTime;
  244. }
  245. }
  246. }