diff --git a/pom.xml b/pom.xml
index b0a76b9..3db48ec 100644
--- a/pom.xml
+++ b/pom.xml
@@ -122,10 +122,22 @@
commons-io
2.11.0
+
+
+
+
+
+
- com.mpatric
- mp3agic
- 0.9.1
+ org
+ jaudiotagger
+ 2.0.1
+
+
+
+ com.github.stuxuhai
+ jpinyin
+ 1.1.8
diff --git a/src/main/java/com/qiwenshare/file/api/IFiletransferService.java b/src/main/java/com/qiwenshare/file/api/IFiletransferService.java
index 9aea83d..bc692a1 100644
--- a/src/main/java/com/qiwenshare/file/api/IFiletransferService.java
+++ b/src/main/java/com/qiwenshare/file/api/IFiletransferService.java
@@ -6,6 +6,7 @@ import com.qiwenshare.file.dto.file.DownloadFileDTO;
import com.qiwenshare.file.dto.file.PreviewDTO;
import com.qiwenshare.file.dto.file.UploadFileDTO;
import com.qiwenshare.file.vo.file.UploadFileVo;
+import com.qiwenshare.ufop.constant.StorageTypeEnum;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
diff --git a/src/main/java/com/qiwenshare/file/component/FileDealComp.java b/src/main/java/com/qiwenshare/file/component/FileDealComp.java
index 5af0f25..7ec5fa2 100644
--- a/src/main/java/com/qiwenshare/file/component/FileDealComp.java
+++ b/src/main/java/com/qiwenshare/file/component/FileDealComp.java
@@ -1,23 +1,27 @@
package com.qiwenshare.file.component;
import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.stuxuhai.jpinyin.PinyinException;
+import com.github.stuxuhai.jpinyin.PinyinFormat;
+import com.github.stuxuhai.jpinyin.PinyinHelper;
import com.qiwenshare.common.util.DateUtil;
import com.qiwenshare.file.api.IShareFileService;
import com.qiwenshare.file.api.IShareService;
import com.qiwenshare.file.api.IUserService;
import com.qiwenshare.file.config.es.FileSearch;
-import com.qiwenshare.file.domain.FileBean;
-import com.qiwenshare.file.domain.Share;
-import com.qiwenshare.file.domain.ShareFile;
-import com.qiwenshare.file.domain.UserFile;
+import com.qiwenshare.file.domain.*;
import com.qiwenshare.file.io.QiwenFile;
import com.qiwenshare.file.mapper.FileMapper;
+import com.qiwenshare.file.mapper.MusicMapper;
import com.qiwenshare.file.mapper.UserFileMapper;
+import com.qiwenshare.file.util.HttpsUtils;
import com.qiwenshare.file.util.QiwenFileUtil;
import com.qiwenshare.file.util.TreeNode;
+import com.qiwenshare.ufop.constant.StorageTypeEnum;
import com.qiwenshare.ufop.factory.UFOPFactory;
import com.qiwenshare.ufop.operation.copy.Copier;
import com.qiwenshare.ufop.operation.copy.domain.CopyFile;
@@ -27,19 +31,31 @@ import com.qiwenshare.ufop.operation.read.Reader;
import com.qiwenshare.ufop.operation.read.domain.ReadFile;
import com.qiwenshare.ufop.operation.write.Writer;
import com.qiwenshare.ufop.operation.write.domain.WriteFile;
+import com.qiwenshare.ufop.util.UFOPUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
+import org.jaudiotagger.audio.AudioFile;
+import org.jaudiotagger.audio.AudioFileIO;
+import org.jaudiotagger.audio.AudioHeader;
+import org.jaudiotagger.audio.flac.FlacFileReader;
+import org.jaudiotagger.audio.mp3.MP3File;
+import org.jaudiotagger.tag.FieldKey;
+import org.jaudiotagger.tag.Tag;
+import org.jaudiotagger.tag.datatype.Artwork;
+import org.jaudiotagger.tag.id3.AbstractID3v2Frame;
+import org.jaudiotagger.tag.id3.AbstractID3v2Tag;
+import org.jaudiotagger.tag.id3.framebody.FrameBodyAPIC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
+import java.util.*;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@@ -50,18 +66,19 @@ import java.util.concurrent.Executors;
@Component
public class FileDealComp {
@Resource
- UserFileMapper userFileMapper;
+ private UserFileMapper userFileMapper;
@Resource
- FileMapper fileMapper;
+ private FileMapper fileMapper;
@Resource
- IUserService userService;
+ private IUserService userService;
@Resource
- IShareService shareService;
+ private IShareService shareService;
@Resource
- IShareFileService shareFileService;
+ private IShareFileService shareFileService;
@Resource
- UFOPFactory ufopFactory;
-
+ private UFOPFactory ufopFactory;
+ @Resource
+ private MusicMapper musicMapper;
@Autowired
private ElasticsearchClient elasticsearchClient;
@@ -125,7 +142,6 @@ public class FileDealComp {
* 1、回收站文件还原操作会将文件恢复到原来的路径下,当还原文件的时候,如果父目录已经不存在了,则需要把父母录给还原
* 2、上传目录
*
- * @param filePath
* @param sessionUserId
*/
public void restoreParentFilePath(QiwenFile ufopFile1, Long sessionUserId) {
@@ -170,7 +186,7 @@ public class FileDealComp {
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.select(UserFile::getFileName, UserFile::getFilePath)
- .likeRight(UserFile::getFilePath, filePath)
+ .likeRight(UserFile::getFilePath, QiwenFileUtil.formatLikePath(filePath))
.eq(UserFile::getIsDir, 1)
.eq(UserFile::getDeleteFlag, 0)
.eq(UserFile::getUserId, sessionUserId)
@@ -422,4 +438,196 @@ public class FileDealComp {
}
return false;
}
+
+
+ public void parseMusicFile(String extendName, int storageType, String fileUrl, String fileId) {
+ File outFile = null;
+ InputStream inputStream = null;
+ FileOutputStream fileOutputStream = null;
+ try {
+ if ("mp3".equalsIgnoreCase(extendName) || "flac".equalsIgnoreCase(extendName)) {
+ Downloader downloader = ufopFactory.getDownloader(storageType);
+ DownloadFile downloadFile = new DownloadFile();
+ downloadFile.setFileUrl(fileUrl);
+ inputStream = downloader.getInputStream(downloadFile);
+ outFile = UFOPUtils.getTempFile(fileUrl);
+ if (!outFile.exists()) {
+ outFile.createNewFile();
+ }
+ fileOutputStream = new FileOutputStream(outFile);
+ IOUtils.copy(inputStream, fileOutputStream);
+ Music music = new Music();
+ music.setMusicId(IdUtil.getSnowflakeNextIdStr());
+ music.setFileId(fileId);
+
+ Tag tag = null;
+ AudioHeader audioHeader = null;
+ if ("mp3".equalsIgnoreCase(extendName)) {
+ MP3File f = (MP3File) AudioFileIO.read(outFile);
+ tag = f.getTag();
+ audioHeader = f.getAudioHeader();
+ MP3File mp3file = new MP3File(outFile);
+ if (mp3file.hasID3v2Tag()) {
+ AbstractID3v2Tag id3v2Tag = mp3file.getID3v2TagAsv24();
+ AbstractID3v2Frame frame = (AbstractID3v2Frame) id3v2Tag.getFrame("APIC");
+ FrameBodyAPIC body;
+ if (frame != null && !frame.isEmpty()) {
+ body = (FrameBodyAPIC) frame.getBody();
+ byte[] imageData = body.getImageData();
+ music.setAlbumImage(Base64.getEncoder().encodeToString(imageData));
+ }
+ if (tag != null) {
+ music.setArtist(tag.getFirst(FieldKey.ARTIST));
+ music.setTitle(tag.getFirst(FieldKey.TITLE));
+ music.setAlbum(tag.getFirst(FieldKey.ALBUM));
+ music.setYear(tag.getFirst(FieldKey.YEAR));
+ try {
+ music.setTrack(tag.getFirst(FieldKey.TRACK));
+ } catch (Exception e) {
+ // ignore
+ }
+
+ music.setGenre(tag.getFirst(FieldKey.GENRE));
+ music.setComment(tag.getFirst(FieldKey.COMMENT));
+ music.setLyrics(tag.getFirst(FieldKey.LYRICS));
+ music.setComposer(tag.getFirst(FieldKey.COMPOSER));
+ music.setAlbumArtist(tag.getFirst(FieldKey.ALBUM_ARTIST));
+ music.setEncoder(tag.getFirst(FieldKey.ENCODER));
+ }
+ }
+ } else if ("flac".equalsIgnoreCase(extendName)) {
+ AudioFile f = new FlacFileReader().read(outFile);
+ tag = f.getTag();
+ audioHeader = f.getAudioHeader();
+ if (tag != null) {
+ music.setArtist(StringUtils.join(tag.getFields(FieldKey.ARTIST), ","));
+ music.setTitle(StringUtils.join(tag.getFields(FieldKey.TITLE), ","));
+ music.setAlbum(StringUtils.join(tag.getFields(FieldKey.ALBUM), ","));
+ music.setYear(StringUtils.join(tag.getFields(FieldKey.YEAR), ","));
+ music.setTrack(StringUtils.join(tag.getFields(FieldKey.TRACK), ","));
+ music.setGenre(StringUtils.join(tag.getFields(FieldKey.GENRE), ","));
+ music.setComment(StringUtils.join(tag.getFields(FieldKey.COMMENT), ","));
+ music.setLyrics(StringUtils.join(tag.getFields(FieldKey.LYRICS), ","));
+ music.setComposer(StringUtils.join(tag.getFields(FieldKey.COMPOSER), ","));
+ music.setAlbumArtist(StringUtils.join(tag.getFields(FieldKey.ALBUM_ARTIST), ","));
+ music.setEncoder(StringUtils.join(tag.getFields(FieldKey.ENCODER), ","));
+ List artworkList = tag.getArtworkList();
+ if (artworkList != null && !artworkList.isEmpty()) {
+ Artwork artwork = artworkList.get(0);
+ byte[] binaryData = artwork.getBinaryData();
+ music.setAlbumImage(Base64.getEncoder().encodeToString(binaryData));
+ }
+ }
+
+ }
+
+ if (audioHeader != null) {
+ music.setTrackLength(Float.parseFloat(audioHeader.getTrackLength() + ""));
+ }
+
+ if (StringUtils.isEmpty(music.getLyrics())) {
+ try {
+ String lyc = getLyc(music.getArtist(), music.getTitle());
+ music.setLyrics(lyc);
+ } catch (Exception e) {
+ log.info(e.getMessage());
+ }
+ }
+ musicMapper.insert(music);
+ }
+ } catch (Exception e) {
+ log.error("解析音乐信息失败!", e);
+ } finally {
+ IOUtils.closeQuietly(inputStream);
+ IOUtils.closeQuietly(fileOutputStream);
+ if (outFile != null) {
+ if (outFile.exists()) {
+ outFile.delete();
+ }
+ }
+ }
+ }
+
+ public String getLyc(String singerName, String mp3Name) {
+
+ String s = HttpsUtils.doGetString("https://c.y.qq.com/splcloud/fcgi-bin/smartbox_new.fcg?_=1651992748984&cv=4747474&ct=24&format=json&inCharset=utf-8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=1&uin=0&g_tk_new_20200303=5381&g_tk=5381&hostUin=0&is_xml=0&key=" + mp3Name.replaceAll(" ", ""));
+ Map map = JSON.parseObject(s, Map.class);
+ Map data = (Map) map.get("data");
+ Map song = (Map) data.get("song");
+ List