AudioServiceImpl.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  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.setProductPackage(album.getProductPackage());
  76. audio.setAlbum(album.getName());
  77. if (StringUtils.isNotBlank(album.getImage())) {
  78. audio.setAlbumImage(imgURL + album.getImage());
  79. }
  80. }
  81. });
  82. }
  83. @Override
  84. public Page<Audio> SearchByIdGroup(int mediaType, Long idGroup, int page, int size){
  85. if(size<=0)
  86. size = 50;
  87. Pageable pageable = new PageRequest(page, size);
  88. Page<Audio> list = null;
  89. if(mediaType== MediaType.AUDIO.getCode() || mediaType==MediaType.VIDEO.getCode())
  90. list = audioRepo.findByMediaTypeAndIdGroup(mediaType, idGroup, pageable);
  91. else
  92. list = audioRepo.findByIdGroup(idGroup, pageable);
  93. fillAlbum(list.getContent());
  94. return list;
  95. }
  96. @Override
  97. public List<Audio> SearchByName(int mediaType, String name){
  98. if(name==null || name.isEmpty())
  99. return null;
  100. List<Audio> list = null;
  101. if(mediaType== MediaType.AUDIO.getCode() || mediaType==MediaType.VIDEO.getCode())
  102. list = audioRepo.findByMediaTypeAndName(mediaType, name);
  103. else
  104. list = audioRepo.findByName(name);
  105. // System.out.println("list1:"+list.toString());
  106. if(CollectionUtils.isEmpty(list)){
  107. list = audioRepo.findByNameLike(name);
  108. System.out.println("list:"+list.toString());
  109. }
  110. fillAlbum(list);
  111. // System.out.println("list2:"+list.toString());
  112. return list;
  113. }
  114. @Override
  115. public List<Audio> SearchByAlbum(int mediaType, String album){
  116. if(album==null || album.isEmpty())
  117. return null;
  118. List<BigInteger> albumIds = albumRepo.findIdsByNameLike(album);
  119. List<Audio> list = null;
  120. if(mediaType== MediaType.AUDIO.getCode() || mediaType==MediaType.VIDEO.getCode())
  121. list = audioRepo.findByMediaTypeAndAlbumIdIn(mediaType, albumIds);
  122. else
  123. list = audioRepo.findByAlbumIdIn(albumIds);
  124. fillAlbum(list);
  125. return list;
  126. }
  127. @Override
  128. public List<Audio> SearchByNameAlbum(int mediaType, String name, String album){
  129. if(name==null || name.isEmpty()
  130. || album==null || album.isEmpty())
  131. return null;
  132. List<BigInteger> albumIds = albumRepo.findIdsByNameLike(album);
  133. List<Audio> list = null;
  134. if(mediaType== MediaType.AUDIO.getCode() || mediaType==MediaType.VIDEO.getCode())
  135. list = audioRepo.findByMediaTypeAndNameAndAlbumIdIn(mediaType, name, albumIds);
  136. else
  137. list = audioRepo.findByNameAndAlbumIdIn(name, albumIds);
  138. if(CollectionUtils.isEmpty(list))
  139. list = audioRepo.findByNameLikeAndAlbumIdIn(name, albumIds);
  140. fillAlbum(list);
  141. return list;
  142. }
  143. @Override
  144. public Audio Insert(Audio audio){
  145. Audio a = audioRepo.save(audio);
  146. return a;
  147. }
  148. @Override
  149. public void Delete(Long id){
  150. audioRepo.delete(id);
  151. }
  152. @Override
  153. public OnePage<Audio> pageList(Audio audio, Integer pageNo, Integer pageSize) {
  154. long count = audioRepo.count(audio);
  155. OnePage onePage = new OnePage(count,pageNo,pageSize);
  156. if (count == 0) {
  157. return onePage;
  158. }
  159. List<Audio> audios = audioRepo.find(audio, onePage.getStart(),onePage.getPageSize());
  160. fillAlbum(audios);
  161. onePage.setList(audios);
  162. return onePage;
  163. }
  164. @Override
  165. public OnePage<Audio> searchList(SearchVO searchVO) {
  166. Album searchAlbum = fillSearchAlbum(searchVO);
  167. List<Album> albumList = albumRepo.find(searchAlbum);
  168. if (CollectionUtils.isEmpty(albumList)) {
  169. return new OnePage(0L,searchVO.getPageNo(),searchVO.getPageSize());
  170. }
  171. List<BigInteger> albumIds = new ArrayList<>();
  172. albumList.forEach(album -> albumIds.add(album.getId()));
  173. searchVO.setIdAlbums(albumIds);
  174. Long count = audioRepoImpl.count(searchVO);
  175. if (Objects.isNull(count)) {
  176. count = 0L;
  177. }
  178. OnePage<Audio> onePage = new OnePage(count,searchVO.getPageNo(),searchVO.getPageSize());
  179. if (count == 0) {
  180. return onePage;
  181. }
  182. List<Audio> audioList = audioRepoImpl.findAudio(searchVO, onePage.getStart(), onePage.getPageSize());
  183. fillAlbum(audioList);
  184. onePage.setList(audioList);
  185. return onePage;
  186. }
  187. private Album fillSearchAlbum(SearchVO searchVO) {
  188. Album album = new Album();
  189. album.setId(searchVO.getAlbumId());
  190. album.setMediaType(searchVO.getMediaType());
  191. if (StringUtils.isNotBlank(searchVO.getAlbum())) {
  192. album.setName("%" + searchVO.getAlbum() + "%");
  193. }
  194. if (StringUtils.isNotBlank(searchVO.getAge())) {
  195. album.setAge("%" + searchVO.getAge() + "%");
  196. }
  197. if (StringUtils.isNotBlank(searchVO.getLanguage())) {
  198. album.setLanguage("%" + searchVO.getLanguage() + "%");
  199. }
  200. if (StringUtils.isNotBlank(searchVO.getSubject())) {
  201. album.setSubject("%" + searchVO.getSubject() + "%");
  202. }
  203. if (StringUtils.isNotBlank(searchVO.getSuitableCrowd())) {
  204. album.setSuitableCrowd("%" + searchVO.getSuitableCrowd() + "%");
  205. }
  206. if (StringUtils.isNotBlank(searchVO.getVersion())) {
  207. album.setVersion("%" + searchVO.getVersion() + "%");
  208. }
  209. if (StringUtils.isNotBlank(searchVO.getVolume())) {
  210. album.setVolume("%" + searchVO.getVolume() + "%");
  211. }
  212. return album;
  213. }
  214. @Override
  215. public Audio getAudioInfo(Long id) {
  216. if (Objects.isNull(id) || id < 1) {
  217. return null;
  218. }
  219. Audio audio = audioRepo.find(id);
  220. if (Objects.isNull(audio)) {
  221. return null;
  222. }
  223. Album album = albumRepo.find(audio.getAlbumId());
  224. if (Objects.nonNull(album)) {
  225. audio.setAlbum(album.getName());
  226. if (StringUtils.isNotBlank(album.getImage())) {
  227. audio.setAlbumImage(imgURL + album.getImage());
  228. }
  229. }
  230. return audio;
  231. }
  232. @Override
  233. public ApiResult countTime() {
  234. //TODO
  235. List<Audio> allAudio = audioRepo.findAll();
  236. List<Audio> newAudioList = new ArrayList<>();
  237. long startTime = System.currentTimeMillis();
  238. allAudio.forEach(audio -> {
  239. long timeLength = getMicrosecondLength(audio.getUrl());
  240. audio.setTotalTime(timeLength);
  241. newAudioList.add(audio);
  242. });
  243. List<Audio> update = audioRepo.update(newAudioList);
  244. System.out.println("耗时 :" + (System.currentTimeMillis() - startTime));
  245. return ApiResult.ok(update.size());
  246. }
  247. /**
  248. * 获取音频文件时长
  249. *
  250. * @param filePath wav文件路径,支持本地和网络HTTP路径
  251. * @return 时长/毫秒,可 /1000D 得到秒
  252. * @throws Exception
  253. */
  254. public static long getMicrosecondLength(String filePath) {
  255. long countTime = 0;
  256. try {
  257. URL urlfile = new URL(filePath);
  258. //File file = new File("C:\\music\\test2.mp3");
  259. //URL urlfile = file.toURI().toURL();
  260. URLConnection con = urlfile.openConnection();
  261. int b = con.getContentLength();// 得到音乐文件的总长度
  262. BufferedInputStream bis = new BufferedInputStream(con.getInputStream());
  263. Bitstream bt = new Bitstream(bis);
  264. Header h = bt.readFrame();
  265. int time = (int) h.total_ms(b);
  266. // System.out.println(time / 1000);
  267. countTime = time/1000;
  268. } catch (Exception e) {
  269. // e.printStackTrace();
  270. log.error("get time is error! url : {}" ,filePath);
  271. } finally {
  272. return countTime;
  273. }
  274. }
  275. }