|
|
@@ -0,0 +1,169 @@
|
|
|
+package cn.reghao.oss.store.rpc;
|
|
|
+
|
|
|
+import cn.reghao.jutil.media.FFmpegWrapper;
|
|
|
+import cn.reghao.jutil.media.model.MediaProps;
|
|
|
+import cn.reghao.oss.store.api.constant.ObjectType;
|
|
|
+import cn.reghao.oss.store.api.dto.MediaDeleteDto;
|
|
|
+import cn.reghao.oss.store.api.dto.MediaScopeDto;
|
|
|
+import cn.reghao.oss.store.api.dto.ObjectMeta;
|
|
|
+import cn.reghao.oss.store.api.dto.media.*;
|
|
|
+import cn.reghao.oss.store.api.iface.MediaService;
|
|
|
+import cn.reghao.oss.store.api.iface.ObjectService;
|
|
|
+import cn.reghao.oss.store.db.repository.AudioRepository;
|
|
|
+import cn.reghao.oss.store.db.repository.ImageRepository;
|
|
|
+import cn.reghao.oss.store.db.repository.ObjectRepository;
|
|
|
+import cn.reghao.oss.store.db.repository.VideoRepository;
|
|
|
+import cn.reghao.oss.store.model.po.AudioFile;
|
|
|
+import cn.reghao.oss.store.model.po.ImageFile;
|
|
|
+import cn.reghao.oss.store.model.po.VideoFile;
|
|
|
+import cn.reghao.oss.store.service.SignService;
|
|
|
+import org.apache.dubbo.config.annotation.DubboService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author reghao
|
|
|
+ * @date 2024-03-07 09:52:59
|
|
|
+ */
|
|
|
+@DubboService
|
|
|
+@Service
|
|
|
+public class MediaServiceImpl implements MediaService {
|
|
|
+ private final LocalDateTime epoch = LocalDateTime.parse("1970-01-01T08:00");
|
|
|
+
|
|
|
+ private final ObjectService objectService;
|
|
|
+ private final ObjectRepository objectRepository;
|
|
|
+ private final VideoRepository videoRepository;
|
|
|
+ private final ImageRepository imageRepository;
|
|
|
+ private final AudioRepository audioRepository;
|
|
|
+ private final SignService signService;
|
|
|
+
|
|
|
+ public MediaServiceImpl(ObjectService objectService, ObjectRepository objectRepository,
|
|
|
+ VideoRepository videoRepository, ImageRepository imageRepository,
|
|
|
+ AudioRepository audioRepository, SignService signService) {
|
|
|
+ this.objectRepository = objectRepository;
|
|
|
+ this.objectService = objectService;
|
|
|
+ this.videoRepository = videoRepository;
|
|
|
+ this.imageRepository = imageRepository;
|
|
|
+ this.audioRepository = audioRepository;
|
|
|
+ this.signService = signService;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setMediaFileScope(MediaScopeDto mediaScopeDto) {
|
|
|
+ List<String> mediaIds = mediaScopeDto.getMediaIds();
|
|
|
+ int scope = mediaScopeDto.getScope();
|
|
|
+ int contentType = mediaScopeDto.getObjectType();
|
|
|
+ ObjectType objectType = ObjectType.getByCode(contentType);
|
|
|
+ switch (objectType) {
|
|
|
+ case Video:
|
|
|
+ List<String> objectIds = videoRepository.getVideoFiles(mediaIds.get(0)).stream()
|
|
|
+ .map(VideoFile::getObjectId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ objectService.setObjectsScope(scope, objectIds);
|
|
|
+ break;
|
|
|
+ case Image:
|
|
|
+ List<String> objectIds1 = imageRepository.getImageFiles(mediaIds).stream()
|
|
|
+ .map(ImageFile::getObjectId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ objectService.setObjectsScope(scope, objectIds1);
|
|
|
+ break;
|
|
|
+ case Audio:
|
|
|
+ List<String> objectIds2 = audioRepository.findAudioFiles(mediaIds.get(0)).stream()
|
|
|
+ .map(AudioFile::getObjectId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ objectService.setObjectsScope(scope, objectIds2);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteMediaFile(MediaDeleteDto mediaDeleteDto) {
|
|
|
+ List<String> mediaIds = mediaDeleteDto.getMediaIds();
|
|
|
+ int contentType = mediaDeleteDto.getObjectType();
|
|
|
+ ObjectType objectType = ObjectType.getByCode(contentType);
|
|
|
+ switch (objectType) {
|
|
|
+ case Video:
|
|
|
+ List<String> objectIds = videoRepository.deleteVideoFile(mediaIds.get(0));
|
|
|
+ objectRepository.deleteByObjectIds(objectIds);
|
|
|
+ break;
|
|
|
+ case Image:
|
|
|
+ imageRepository.deleteByImageFileIds(mediaIds);
|
|
|
+ break;
|
|
|
+ case Audio:
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<VideoUrlDto> getVideoUrls(int loginUser, String videoFileId, int expireSecond) {
|
|
|
+ List<VideoUrlDto> list = videoRepository.findVideoUrls(videoFileId);
|
|
|
+ list.forEach(videoUrlDto -> {
|
|
|
+ String url = videoUrlDto.getUrl();
|
|
|
+ String signedUrl = signService.getSignedUrl(loginUser, url, expireSecond);
|
|
|
+ videoUrlDto.setUrl(signedUrl);
|
|
|
+ });
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public VideoInfo getVideoInfo(String videoFileId) {
|
|
|
+ List<VideoInfo> list = videoRepository.getVideoInfos(videoFileId);
|
|
|
+ if (!list.isEmpty()) {
|
|
|
+ VideoInfo videoInfo = list.get(0);
|
|
|
+ videoInfo.setCreateTime(getCreateTime(videoFileId));
|
|
|
+ return videoInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private LocalDateTime getCreateTime(String videoFileId) {
|
|
|
+ ObjectMeta objectMeta = objectRepository.getObjectMetaById(videoFileId);
|
|
|
+ if (objectMeta == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ String absolutePath = objectMeta.getAbsolutePath();
|
|
|
+ MediaProps mediaProps = FFmpegWrapper.getMediaProps(absolutePath);
|
|
|
+ if (mediaProps == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ LocalDateTime localDateTime = mediaProps.getCreateTime();
|
|
|
+ if (localDateTime != null && !localDateTime.equals(epoch)) {
|
|
|
+ return localDateTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<ImageUrlDto> getImageUrls(Set<String> imageFileIds) {
|
|
|
+ List<ImageUrlDto> list = imageRepository.getImageUrls(imageFileIds);
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<AudioUrl> getAudioUrls(String audioFileId, int expireSecond) {
|
|
|
+ int loginUser = 10001;
|
|
|
+ List<AudioUrl> audioUrls = audioRepository.getAudioUrls(audioFileId);
|
|
|
+ audioUrls.forEach(audioUrl -> {
|
|
|
+ String url = audioUrl.getUrl();
|
|
|
+ String signedUrl = signService.getSignedUrl(loginUser, url, expireSecond);
|
|
|
+ audioUrl.setUrl(signedUrl);
|
|
|
+ });
|
|
|
+ return audioUrls;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AudioInfo getAudioInfo(String audioFileId) {
|
|
|
+ List<AudioInfo> list = audioRepository.getAudioInfo(audioFileId);
|
|
|
+ return list.isEmpty() ? null : list.get(0);
|
|
|
+ }
|
|
|
+}
|