فهرست منبع

优化媒体文件处理相关代码, 删除无用的代码

reghao 2 سال پیش
والد
کامیت
f12b5e8266

+ 8 - 32
oss-console/src/main/java/cn/reghao/oss/console/app/controller/MediaController.java

@@ -2,8 +2,6 @@ package cn.reghao.oss.console.app.controller;
 
 import cn.reghao.jutil.jdk.result.WebResult;
 import cn.reghao.oss.console.app.model.dto.GetImageUrls;
-import cn.reghao.oss.store.api.dto.MediaDeleteDto;
-import cn.reghao.oss.store.api.dto.MediaScopeDto;
 import cn.reghao.oss.console.app.rpc.MediaRpcService;
 import cn.reghao.oss.store.api.dto.media.*;
 import io.swagger.annotations.Api;
@@ -27,27 +25,6 @@ public class MediaController {
         this.mediaRpcService = mediaRpcService;
     }
 
-    @ApiOperation(value = "设置媒体文件可见范围")
-    @PostMapping(value = "/scope", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String setMediaFileScope(MediaScopeDto mediaScopeDto) throws Exception {
-        mediaRpcService.setMediaFileScope(mediaScopeDto);
-        return WebResult.success();
-    }
-
-    @ApiOperation(value = "删除媒体文件")
-    @PostMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String deleteMediaFile(MediaDeleteDto mediaDeleteDto) throws Exception {
-        mediaRpcService.deleteMediaFile(mediaDeleteDto);
-        return WebResult.success();
-    }
-
-    @ApiOperation(value = "获取视频文件URL")
-    @GetMapping(value = "/video/url", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getVideoUrl(@RequestParam("channelId") Integer channelId, @RequestParam("videoFileId") String videoFileId) throws Exception {
-        List<VideoUrlDto> list = mediaRpcService.getVideoUrls(channelId, videoFileId);
-        return WebResult.success(list);
-    }
-
     @ApiOperation(value = "获取视频文件信息")
     @GetMapping(value = "/video/info", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getVideoInfo(@RequestParam("channelId") Integer channelId,
@@ -56,18 +33,17 @@ public class MediaController {
         return WebResult.success(videoInfo);
     }
 
-    @ApiOperation(value = "获取图片文件 url")
-    @PostMapping(value = "/image/urls", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getImageUrls(GetImageUrls getImageUrls) throws Exception {
-        List<ImageUrlDto> list = mediaRpcService.getImageUrls(getImageUrls.getChannelId(), getImageUrls.getImageFileIds());
+    @ApiOperation(value = "获取图片文件信息")
+    @PostMapping(value = "/image/info", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getImagesInfo(GetImageUrls getImageUrls) throws Exception {
+        List<ImageInfo> list = mediaRpcService.getImagesInfo(getImageUrls.getChannelId(), getImageUrls.getImageFileIds());
         return WebResult.success(list);
     }
 
-    @ApiOperation(value = "获取音频文件 url")
-    @GetMapping(value = "/audio/url", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getImageUrls(@RequestParam("channelId") Integer channelId,
-                               @RequestParam("audioFileId") String audioFileId) throws Exception {
-        List<AudioUrl> list = mediaRpcService.getAudioUrls(channelId, audioFileId);
+    @ApiOperation(value = "获取 webp 图片文件信息")
+    @PostMapping(value = "/image/webp", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getWebpInfo(GetImageUrls getImageUrls) throws Exception {
+        List<ConvertedImageInfo> list = mediaRpcService.getWebpInfo(getImageUrls.getChannelId(), getImageUrls.getImageFileIds());
         return WebResult.success(list);
     }
 

+ 2 - 2
oss-console/src/main/java/cn/reghao/oss/console/app/model/dto/GetImageUrls.java

@@ -3,7 +3,7 @@ package cn.reghao.oss.console.app.model.dto;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.Set;
+import java.util.List;
 
 /**
  * @author reghao
@@ -13,5 +13,5 @@ import java.util.Set;
 @Getter
 public class GetImageUrls {
     private Integer channelId;
-    private Set<String> imageFileIds;
+    private List<String> imageFileIds;
 }

+ 5 - 28
oss-console/src/main/java/cn/reghao/oss/console/app/rpc/MediaRpcService.java

@@ -3,14 +3,11 @@ package cn.reghao.oss.console.app.rpc;
 import cn.reghao.oss.console.app.model.po.StoreNode;
 import cn.reghao.oss.console.app.service.UploadChannelService;
 import cn.reghao.oss.console.util.AuthKeyContext;
-import cn.reghao.oss.store.api.dto.MediaDeleteDto;
-import cn.reghao.oss.store.api.dto.MediaScopeDto;
 import cn.reghao.oss.store.api.dto.media.*;
 import cn.reghao.oss.store.api.iface.MediaService;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
-import java.util.Set;
 
 /**
  * @author reghao
@@ -24,40 +21,20 @@ public class MediaRpcService {
         this.uploadChannelService = uploadChannelService;
     }
 
-    public void  setMediaFileScope(MediaScopeDto mediaScopeDto) throws Exception {
-        int channelId = mediaScopeDto.getChannelId();
-        MediaService mediaService = getMediaService(channelId);
-        mediaService.setMediaFileScope(mediaScopeDto);
-    }
-
-    public void deleteMediaFile(MediaDeleteDto mediaDeleteDto) throws Exception {
-        int channelId = mediaDeleteDto.getChannelId();
-        MediaService mediaService = getMediaService(channelId);
-        mediaService.deleteMediaFile(mediaDeleteDto);
-    }
-
-    public List<VideoUrlDto> getVideoUrls(int channelId, String videoFileId) throws Exception {
-        int loginUser = AuthKeyContext.getUser();
-        MediaService mediaService = getMediaService(channelId);
-
-        int expireSecond = 3600;
-        return mediaService.getVideoUrls(loginUser, videoFileId, expireSecond);
-    }
-
     public VideoInfo getVideoInfo(int channelId, String videoFileId) throws Exception {
         MediaService mediaService = getMediaService(channelId);
         return mediaService.getVideoInfo(videoFileId);
     }
 
-    public List<ImageUrlDto> getImageUrls(int channelId, Set<String> imageFileIds) throws Exception {
+    public List<ImageInfo> getImagesInfo(int channelId, List<String> imageFileIds) throws Exception {
         MediaService mediaService = getMediaService(channelId);
-        return mediaService.getImageUrls(imageFileIds);
+        return mediaService.getImagesInfo(imageFileIds);
     }
 
-    public List<AudioUrl> getAudioUrls(int channelId, String audioFileId) throws Exception {
+    public List<ConvertedImageInfo> getWebpInfo(int channelId, List<String> imageFileIds) throws Exception {
+        int loginUser = AuthKeyContext.getUser();
         MediaService mediaService = getMediaService(channelId);
-        int expireSecond = 3600;
-        return mediaService.getAudioUrls(audioFileId, expireSecond);
+        return mediaService.getWebpInfo(loginUser, imageFileIds);
     }
 
     public AudioInfo getAudioInfo(int channelId, String audioFileId) throws Exception {

+ 5 - 0
oss-console/src/main/java/cn/reghao/oss/console/app/rpc/RemoteService.java

@@ -1,6 +1,7 @@
 package cn.reghao.oss.console.app.rpc;
 
 import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ConsumerConfig;
 import org.apache.dubbo.config.ReferenceConfig;
 
 /**
@@ -16,6 +17,9 @@ public class RemoteService<T> {
         ApplicationConfig application = new ApplicationConfig();
         application.setName(serviceName);
 
+        ConsumerConfig consumerConfig = new ConsumerConfig();
+        consumerConfig.setTimeout(30_000);
+
         // 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
         // 引用远程服务
         // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
@@ -23,6 +27,7 @@ public class RemoteService<T> {
         reference.setApplication(application);
         reference.setInterface(clazz);
         reference.setUrl(dubboUrl);
+        reference.setConsumer(consumerConfig);
         return reference.get();
     }
 }

+ 42 - 5
oss-sdk/src/main/java/cn/reghao/oss/sdk/OssConsoleClient.java

@@ -376,12 +376,49 @@ public class OssConsoleClient {
         return webResult.getData();
     }
 
-    public ImageInfo getImageInfo(int channelId, String imageFileId) throws Exception {
-        String api = String.format("%s/api/oss/media/image/info?channelId=%s&videoFileId=%s", endpoint, channelId, imageFileId);
+    public List<ImageInfo> getImagesInfo(int channelId, List<String> imageFileIds) throws Exception {
+        String imageFileIdsStr = imageFileIds.toString().replace("[", "").replace("]", "");
+        Map<String, String> formData = new HashMap<>();
+        formData.put("channelId", ""+channelId);
+        formData.put("imageFileIds", imageFileIdsStr);
+
+        String api = String.format("%s/api/oss/media/image/info", endpoint);
         HttpRequest httpRequest = HttpRequest.newBuilder(new URI(api))
                 .header("authorization", "Bearer " + token)
+                .headers("content-type", "application/x-www-form-urlencoded")
                 .version(HttpClient.Version.HTTP_1_1)
-                .GET()
+                .POST(HttpRequest.BodyPublishers.ofString(getFormDataAsString(formData)))
+                .build();
+        HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
+        int statusCode = httpResponse.statusCode();
+        String body = httpResponse.body();
+        if (statusCode != 200) {
+            String errMsg = String.format("%s -> %s", statusCode, body);
+            throw new Exception(errMsg);
+        }
+
+        Type type = new TypeToken<WebResult<List<ImageInfo>>>(){}.getType();
+        WebResult<List<ImageInfo>> webResult = JsonConverter.jsonToObject(body, type);
+        if (webResult.getCode() != 0) {
+            String errMsg = String.format("%s - %s", webResult.getCode(), webResult.getMsg());
+            throw new Exception(errMsg);
+        }
+
+        return webResult.getData();
+    }
+
+    public List<ConvertedImageInfo> getWebpInfo(int channelId, List<String> imageFileIds) throws Exception {
+        String imageFileIdsStr = imageFileIds.toString().replace("[", "").replace("]", "");
+        Map<String, String> formData = new HashMap<>();
+        formData.put("channelId", ""+channelId);
+        formData.put("imageFileIds", imageFileIdsStr);
+
+        String api = String.format("%s/api/oss/media/image/webp", endpoint);
+        HttpRequest httpRequest = HttpRequest.newBuilder(new URI(api))
+                .header("authorization", "Bearer " + token)
+                .headers("content-type", "application/x-www-form-urlencoded")
+                .version(HttpClient.Version.HTTP_1_1)
+                .POST(HttpRequest.BodyPublishers.ofString(getFormDataAsString(formData)))
                 .build();
         HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
         int statusCode = httpResponse.statusCode();
@@ -391,8 +428,8 @@ public class OssConsoleClient {
             throw new Exception(errMsg);
         }
 
-        Type type = new TypeToken<WebResult<ImageInfo>>(){}.getType();
-        WebResult<ImageInfo> webResult = JsonConverter.jsonToObject(body, type);
+        Type type = new TypeToken<WebResult<List<ConvertedImageInfo>>>(){}.getType();
+        WebResult<List<ConvertedImageInfo>> webResult = JsonConverter.jsonToObject(body, type);
         if (webResult.getCode() != 0) {
             String errMsg = String.format("%s - %s", webResult.getCode(), webResult.getMsg());
             throw new Exception(errMsg);

+ 0 - 1
oss-store/src/main/java/cn/reghao/oss/store/db/repository/ImageRepository.java

@@ -53,7 +53,6 @@ public class ImageRepository {
     @Transactional(rollbackFor = Exception.class)
     public void deleteImageFile0(String imageFileId, List<String> objectIds) {
         imageFileMapper.deleteByImageFileId(imageFileId);
-        objectRepository.deleteByObjectIds(objectIds);
     }
 
     public List<ImageFile> findImageFiles(String imageFileId) {

+ 30 - 127
oss-store/src/main/java/cn/reghao/oss/store/rpc/MediaServiceImpl.java

@@ -1,169 +1,72 @@
 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 cn.reghao.oss.store.task.processor.MediaFileProcessor;
+import cn.reghao.oss.store.util.UserContext;
+import lombok.extern.slf4j.Slf4j;
 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
  */
+@Slf4j
 @DubboService
 @Service
 public class MediaServiceImpl implements MediaService {
     private final LocalDateTime epoch = LocalDateTime.parse("1970-01-01T08:00");
+    private final MediaFileProcessor mediaFileProcessor;
 
-    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:
-        }
+    public MediaServiceImpl(MediaFileProcessor mediaFileProcessor) {
+        this.mediaFileProcessor = mediaFileProcessor;
     }
 
-    @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));
+        try {
+            VideoInfo videoInfo = mediaFileProcessor.getVideoInfo(videoFileId);
             return videoInfo;
+        } catch (Exception e) {
+            e.printStackTrace();
         }
 
         return null;
     }
 
-    private LocalDateTime getCreateTime(String videoFileId) {
-        ObjectMeta objectMeta = objectRepository.getObjectMetaById(videoFileId);
-        if (objectMeta == null) {
-            return null;
+    public ImageInfo getImageInfo(String imageFileId) {
+        try {
+            ImageInfo imageInfo = mediaFileProcessor.getImageInfo(imageFileId);
+            return imageInfo;
+        } catch (Exception e) {
+            e.printStackTrace();
         }
 
-        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;
+    public List<ImageInfo> getImagesInfo(List<String> imageFileIds) {
+        return mediaFileProcessor.getImagesInfo(imageFileIds);
     }
 
-    @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;
+    public List<ConvertedImageInfo> getWebpInfo(int loginUser, List<String> imageFileIds) {
+        UserContext userContext = new UserContext(loginUser);
+        return mediaFileProcessor.getWebpInfos(imageFileIds);
     }
 
     @Override
     public AudioInfo getAudioInfo(String audioFileId) {
-        List<AudioInfo> list = audioRepository.getAudioInfo(audioFileId);
-        return list.isEmpty() ? null : list.get(0);
+        try {
+            AudioInfo audioInfo = mediaFileProcessor.getAudioInfo(audioFileId);
+            return audioInfo;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
     }
 }

+ 7 - 0
oss-store/src/main/java/cn/reghao/oss/store/service/PutObjectService.java

@@ -1,5 +1,6 @@
 package cn.reghao.oss.store.service;
 
+import cn.reghao.jutil.jdk.security.DigestUtil;
 import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.model.po.DataBlock;
 import cn.reghao.oss.store.model.po.FileMeta;
@@ -58,6 +59,12 @@ public class PutObjectService {
         }
     }
 
+    public ObjectResult putObject(String originalObjectName, String contentId, String suffix, File savedFile) throws Exception {
+        ObjectProp objectProp = objectNameService.getObjectProp(originalObjectName, suffix);
+        String sha256sum = DigestUtil.sha256sum(savedFile.getAbsolutePath());
+        return putObject(objectProp, contentId, savedFile, "", sha256sum);
+    }
+
     public void putObject(String objectName, byte[] bytes) {
     }
 

+ 198 - 0
oss-store/src/main/java/cn/reghao/oss/store/task/processor/MediaFileProcessor.java

@@ -0,0 +1,198 @@
+package cn.reghao.oss.store.task.processor;
+
+import cn.reghao.jutil.media.FFmpegWrapper;
+import cn.reghao.jutil.media.ImageOps;
+import cn.reghao.jutil.media.MediaQuality;
+import cn.reghao.jutil.media.MediaResolution;
+import cn.reghao.jutil.media.model.AudioProps;
+import cn.reghao.jutil.media.model.MediaProps;
+import cn.reghao.jutil.media.model.VideoProps;
+import cn.reghao.oss.store.api.dto.ObjectMeta;
+import cn.reghao.oss.store.api.dto.media.AudioInfo;
+import cn.reghao.oss.store.api.dto.media.ConvertedImageInfo;
+import cn.reghao.oss.store.api.dto.media.ImageInfo;
+import cn.reghao.oss.store.api.dto.media.VideoInfo;
+import cn.reghao.oss.store.db.repository.ObjectRepository;
+import cn.reghao.oss.store.model.vo.ObjectResult;
+import cn.reghao.oss.store.service.FileStoreService;
+import cn.reghao.oss.store.service.ObjectNameService;
+import cn.reghao.oss.store.service.PutObjectService;
+import cn.reghao.oss.store.util.FileType;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2023-01-11 10:40:17
+ */
+@Slf4j
+@Service
+public class MediaFileProcessor {
+    private final ObjectRepository objectRepository;
+    private final ObjectNameService objectNameService;
+    private final FileStoreService fileStoreService;
+    private final PutObjectService putObjectService;
+
+    public MediaFileProcessor(ObjectRepository objectRepository, ObjectNameService objectNameService,
+                              FileStoreService fileStoreService, PutObjectService putObjectService) {
+        this.objectRepository = objectRepository;
+        this.objectNameService = objectNameService;
+        this.fileStoreService = fileStoreService;
+        this.putObjectService = putObjectService;
+    }
+
+    public VideoInfo getVideoInfo(String videoFileId) throws Exception {
+        ObjectMeta objectMeta = objectRepository.getObjectMetaById(videoFileId);
+        if (objectMeta == null) {
+            return null;
+        }
+
+        String absolutePath = objectMeta.getAbsolutePath();
+        MediaProps mediaProps = FFmpegWrapper.getMediaProps(absolutePath);
+        if (mediaProps == null) {
+            String errMsg = String.format("%s 的 FFmpeg 媒体信息为 null", videoFileId);
+            throw new Exception(errMsg);
+        }
+
+        VideoProps videoProps = mediaProps.getVideoProps();
+        if (videoProps == null) {
+            String errMsg = String.format("%s 的 FFmpeg 视频信息为 null", videoFileId);
+            throw new Exception(errMsg);
+        }
+
+        String videoCodec = videoProps.getCodecName();
+        long vbitRate = videoProps.getBitRate();
+
+        String audioCodec = null;
+        long abitRate = 0;
+        AudioProps audioProps1 = mediaProps.getAudioProps();
+        if (audioProps1 != null) {
+            audioCodec = audioProps1.getCodecName();
+            abitRate = audioProps1.getBitRate();
+        }
+
+        String objectId = videoFileId;
+        String objectName = objectMeta.getObjectName();
+        String objectUrl = objectNameService.getObjectUrl(objectName);
+        int width = videoProps.getCodedWidth().intValue();
+        int height = videoProps.getCodedHeight().intValue();
+        int duration = videoProps.getDuration().intValue();
+        MediaResolution mediaResolution = MediaQuality.getQuality(width, height);
+        String quality = mediaResolution.getQualityStr();
+        String urlType = FileType.getVideoUrlType(absolutePath);
+        LocalDateTime createTime = mediaProps.getCreateTime();
+
+        return new VideoInfo(videoFileId, objectId, videoCodec, vbitRate, audioCodec, abitRate,
+                urlType, objectUrl, quality, width, height, duration, createTime);
+    }
+
+    public ImageInfo getImageInfo(String imageFileId) throws Exception {
+        ObjectMeta objectMeta = objectRepository.getObjectMetaById(imageFileId);
+        if (objectMeta == null) {
+            return null;
+        }
+
+        String absolutePath = objectMeta.getAbsolutePath();
+        File file = new File(absolutePath);
+        String format = ImageOps.getFormat(file);
+        ImageOps.Size size = ImageOps.info(new File(absolutePath));
+        int width = size.getWidth();
+        int height = size.getHeight();
+        String objectId = imageFileId;
+        String objectName = objectMeta.getObjectName();
+        String objectUrl = objectNameService.getObjectUrl(objectName);
+
+        ImageInfo imageInfo = new ImageInfo(imageFileId, objectId, format, objectUrl, width, height);
+        return imageInfo;
+    }
+
+    public List<ConvertedImageInfo> getWebpInfos(List<String> imageFileIds) {
+        return imageFileIds.stream()
+                .map(imageFileId -> {
+                    try {
+                        return getWebpInfo(imageFileId);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    return null;
+                })
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
+
+    public ConvertedImageInfo getWebpInfo(String imageFileId) throws Exception {
+        ObjectMeta objectMeta = objectRepository.getObjectMetaById(imageFileId);
+        if (objectMeta == null) {
+            log.error("{} not exist", imageFileId);
+            return null;
+        }
+
+        String originalObjectName = objectMeta.getObjectName();
+        String absolutePath = objectMeta.getAbsolutePath();
+        File srcFile = new File(absolutePath);
+
+        String format = "webp";
+        String suffix = "." + format;
+        String contentId = UUID.randomUUID().toString().replace("-", "");
+        String destPath = fileStoreService.genFilePath(contentId, srcFile.length(), suffix);
+        File destFile = new File(destPath);
+        ImageOps.convert2webp(srcFile, destFile);
+
+        if (destFile.exists()) {
+            ObjectResult objectResult1 = putObjectService.putObject(originalObjectName, contentId, suffix, destFile);
+            String objectName1 = objectResult1.getObjectName();
+            String objectId1 = objectResult1.getObjectId();
+            String objectUrl1 = objectNameService.getObjectUrl(objectName1);
+            ConvertedImageInfo convertedImageInfo = new ConvertedImageInfo(imageFileId, objectId1, format, objectUrl1);
+            return convertedImageInfo;
+        } else {
+            log.error("image conversion failed");
+            return null;
+        }
+    }
+
+    public List<ImageInfo> getImagesInfo(List<String> imageFileIds) {
+        return imageFileIds.stream()
+                .map(imageFileId -> {
+                    try {
+                        return getImageInfo(imageFileId);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    return null;
+                })
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
+
+    public AudioInfo getAudioInfo(String audioFileId) throws Exception {
+        ObjectMeta objectMeta = objectRepository.getObjectMetaById(audioFileId);
+        if (objectMeta == null) {
+            return null;
+        }
+
+        String absolutePath = objectMeta.getAbsolutePath();
+        MediaProps mediaProps = FFmpegWrapper.getMediaProps(absolutePath);
+        if (mediaProps == null || mediaProps.getAudioProps() == null) {
+            String errMsg = String.format("%s 的 FFmpeg 音频信息为 null", audioFileId);
+            throw new Exception(errMsg);
+        }
+
+        AudioProps audioProps = mediaProps.getAudioProps();
+        String audioCodec = audioProps.getCodecName();
+        int duration = audioProps.getDuration().intValue();
+        long bitRate = audioProps.getBitRate();
+        String objectId = audioFileId;
+        String objectName = objectMeta.getObjectName();
+        String objectUrl = objectNameService.getObjectUrl(objectName);
+
+        return new AudioInfo(audioFileId, objectId, duration, audioCodec, bitRate, objectUrl);
+    }
+}

+ 0 - 21
store-api/src/main/java/cn/reghao/oss/store/api/dto/MediaDeleteDto.java

@@ -1,21 +0,0 @@
-package cn.reghao.oss.store.api.dto;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2024-03-07 09:48:24
- */
-@Setter
-@Getter
-public class MediaDeleteDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private Integer channelId;
-    private Integer objectType;
-    private List<String> mediaIds;
-}

+ 0 - 22
store-api/src/main/java/cn/reghao/oss/store/api/dto/MediaScopeDto.java

@@ -1,22 +0,0 @@
-package cn.reghao.oss.store.api.dto;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2024-03-07 09:44:01
- */
-@Setter
-@Getter
-public class MediaScopeDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private Integer channelId;
-    private Integer objectType;
-    private List<String> mediaIds;
-    private Integer scope;
-}

+ 4 - 1
store-api/src/main/java/cn/reghao/oss/store/api/dto/media/AudioInfo.java

@@ -1,5 +1,6 @@
 package cn.reghao.oss.store.api.dto.media;
 
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 
@@ -9,13 +10,15 @@ import java.io.Serializable;
  * @author reghao
  * @date 2023-08-28 17:00:56
  */
-@NoArgsConstructor
+@AllArgsConstructor
 @Getter
 public class AudioInfo implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private String audioFileId;
+    private String objectId;
     private int duration;
     private String codec;
+    private Long bitRate;
     private String url;
 }

+ 21 - 0
store-api/src/main/java/cn/reghao/oss/store/api/dto/media/ConvertedImageInfo.java

@@ -0,0 +1,21 @@
+package cn.reghao.oss.store.api.dto.media;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2024-03-08 17:07:23
+ */
+@AllArgsConstructor
+@Getter
+public class ConvertedImageInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String imageFileId;
+    private String objectId;
+    private String format;
+    private String url;
+}

+ 24 - 0
store-api/src/main/java/cn/reghao/oss/store/api/dto/media/ImageInfo.java

@@ -0,0 +1,24 @@
+package cn.reghao.oss.store.api.dto.media;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2024-03-08 10:56:27
+ */
+@AllArgsConstructor
+@Getter
+public class ImageInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // 原始文件的 objectId
+    private String imageFileId;
+    private String objectId;
+    private String format;
+    private String url;
+    private Integer width;
+    private Integer height;
+}

+ 10 - 8
store-api/src/main/java/cn/reghao/oss/store/api/dto/media/VideoInfo.java

@@ -1,8 +1,7 @@
 package cn.reghao.oss.store.api.dto.media;
 
+import lombok.AllArgsConstructor;
 import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
@@ -11,20 +10,23 @@ import java.time.LocalDateTime;
  * @author reghao
  * @date 2023-01-11 10:41:53
  */
-@NoArgsConstructor
-@Setter
+@AllArgsConstructor
 @Getter
 public class VideoInfo implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private String videoFileId;
-    // 单位秒
-    private Integer duration;
-    private Boolean horizontal;
-    private String quality;
+    private String objectId;
     private String videoCodec;
+    private Long vbitRate;
     private String audioCodec;
+    private Long abitRate;
     private String urlType;
     private String url;
+    private String quality;
+    private Integer width;
+    private Integer height;
+    // 单位秒
+    private Integer duration;
     private LocalDateTime createTime;
 }

+ 2 - 8
store-api/src/main/java/cn/reghao/oss/store/api/iface/MediaService.java

@@ -1,22 +1,16 @@
 package cn.reghao.oss.store.api.iface;
 
-import cn.reghao.oss.store.api.dto.MediaDeleteDto;
-import cn.reghao.oss.store.api.dto.MediaScopeDto;
 import cn.reghao.oss.store.api.dto.media.*;
 
 import java.util.List;
-import java.util.Set;
 
 /**
  * @author reghao
  * @date 2024-03-07 09:51:23
  */
 public interface MediaService {
-    void setMediaFileScope(MediaScopeDto mediaScopeDto);
-    void deleteMediaFile(MediaDeleteDto mediaDeleteDto);
-    List<VideoUrlDto> getVideoUrls(int loginUser, String videoFileId, int expireSecond);
     VideoInfo getVideoInfo(String videoFileId);
-    List<ImageUrlDto> getImageUrls(Set<String> imageFileIds);
-    List<AudioUrl> getAudioUrls(String audioFileId, int expireSecond);
+    List<ImageInfo> getImagesInfo(List<String> imageFileIds);
+    List<ConvertedImageInfo> getWebpInfo(int loginUser, List<String> imageFileIds);
     AudioInfo getAudioInfo(String audioFileId);
 }