@@ -66,36 +66,18 @@ public class ImageFoundRequestHandler implements RequestHandler {
|
|||||||
searchResponseYandex = searchImageService.searchReverseByPublicUrl(fileEntity, "yandex_reverse_image",
|
searchResponseYandex = searchImageService.searchReverseByPublicUrl(fileEntity, "yandex_reverse_image",
|
||||||
"visual_matches");
|
"visual_matches");
|
||||||
log.info("searchResponseYandex OK");
|
log.info("searchResponseYandex OK");
|
||||||
log.info("searchResponseYandex OK");
|
|
||||||
log.info("searchResponseYandex OK");
|
|
||||||
log.info("searchResponseYandex OK");
|
|
||||||
log.info("searchResponseYandex OK");
|
|
||||||
log.info("searchResponseYandex OK");
|
|
||||||
log.info("searchResponseYandex OK");
|
|
||||||
log.info("searchResponseYandex OK");
|
|
||||||
log.info("searchResponseYandex OK");
|
|
||||||
List<YandexSearchResponse.ImageResult> allYandexImages = searchImageService.getAllImagesWithoutPagination(
|
List<YandexSearchResponse.ImageResult> allYandexImages = searchImageService.getAllImagesWithoutPagination(
|
||||||
searchResponseYandex, "visual_matches");
|
searchResponseYandex, "visual_matches");
|
||||||
searchResponseGoogle = searchImageService.searchReverseByPublicUrl(fileEntity, "google_lens",
|
searchResponseGoogle = searchImageService.searchReverseByPublicUrl(fileEntity, "google_lens",
|
||||||
"exact_matches");
|
"exact_matches");
|
||||||
log.info("searchResponseGoogle OK");
|
|
||||||
log.info("searchResponseGoogle OK");
|
|
||||||
log.info("searchResponseGoogle OK");
|
|
||||||
log.info("searchResponseGoogle OK");
|
|
||||||
log.info("searchResponseGoogle OK");
|
|
||||||
log.info("searchResponseGoogle OK");
|
|
||||||
log.info("searchResponseGoogle OK");
|
|
||||||
|
|
||||||
|
log.info("searchResponseGoogle OK");
|
||||||
List<YandexSearchResponse.ImageResult> allGoogleImages = searchImageService.getAllImagesWithoutPagination(
|
List<YandexSearchResponse.ImageResult> allGoogleImages = searchImageService.getAllImagesWithoutPagination(
|
||||||
searchResponseGoogle, "exact_matches");
|
searchResponseGoogle, "exact_matches");
|
||||||
allUniqueImages = searchImageService.removeDuplicateUrls(allYandexImages,
|
allUniqueImages = searchImageService.removeDuplicateUrls(allYandexImages,
|
||||||
allGoogleImages);
|
allGoogleImages);
|
||||||
log.info("allUniqueImages OK");
|
log.info("allUniqueImages OK");
|
||||||
log.info("allUniqueImages OK");
|
|
||||||
log.info("allUniqueImages OK");
|
|
||||||
log.info("allUniqueImages OK");
|
|
||||||
log.info("allUniqueImages OK");
|
|
||||||
log.info("allUniqueImages OK");
|
|
||||||
} catch (TimeoutException e) {
|
} catch (TimeoutException e) {
|
||||||
log.warn("Search timeout for file {}, returning empty results", fileId);
|
log.warn("Search timeout for file {}, returning empty results", fileId);
|
||||||
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(),
|
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(),
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ public class FileSimilarityService {
|
|||||||
|
|
||||||
private final AuthTokenRepository authTokenRepository;
|
private final AuthTokenRepository authTokenRepository;
|
||||||
|
|
||||||
|
private final FileEntityRepository fileEntityRepository;
|
||||||
|
|
||||||
@Value("${server.baseurl}")
|
@Value("${server.baseurl}")
|
||||||
private String baseUrl;
|
private String baseUrl;
|
||||||
|
|
||||||
@@ -138,7 +140,18 @@ public class FileSimilarityService {
|
|||||||
return duplicates;
|
return duplicates;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final FileEntityRepository fileEntityRepository;
|
public boolean hasDuplicatesByHash(String path, Long userId,String mimeType) throws Exception {
|
||||||
|
String hash = calculateFileHash(path);
|
||||||
|
List<FileEntity> fileEntityList = fileEntityRepository.findByUserIdAndMimeType(userId, mimeType);
|
||||||
|
|
||||||
|
for (FileEntity file : fileEntityList) {
|
||||||
|
if (calculateFileHash(file.getFilePath()).equals(hash)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public Page<SimilarFileDTO> findSimilarFiles(String fileId, SimilarityFilter filter, Pageable pageable,
|
public Page<SimilarFileDTO> findSimilarFiles(String fileId, SimilarityFilter filter, Pageable pageable,
|
||||||
String authToken) throws Exception {
|
String authToken) throws Exception {
|
||||||
@@ -165,12 +178,12 @@ public class FileSimilarityService {
|
|||||||
.sorted(Comparator.comparingInt(SimilarFileDTO::getHammingDistance))
|
.sorted(Comparator.comparingInt(SimilarFileDTO::getHammingDistance))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
} else {
|
} else {
|
||||||
String hash = calculateFileHash(fileEntity);
|
String hash = calculateFileHash(fileEntity.getFilePath());
|
||||||
Long userId = fileEntity.getUserId();
|
Long userId = fileEntity.getUserId();
|
||||||
List<FileEntity> fileEntityList = fileEntityRepository.findByUserIdAndMimeType(userId, mimeType);
|
List<FileEntity> fileEntityList = fileEntityRepository.findByUserIdAndMimeType(userId, mimeType);
|
||||||
|
|
||||||
for (FileEntity file : fileEntityList) {
|
for (FileEntity file : fileEntityList) {
|
||||||
if (calculateFileHash(file).equals(hash)) {
|
if (calculateFileHash(file.getFilePath()).equals(hash)) {
|
||||||
allResults.add(buildDTO(file));
|
allResults.add(buildDTO(file));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -189,28 +202,15 @@ public class FileSimilarityService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private String calculateFileHash(FileEntity fileEntity) throws Exception {
|
private String calculateFileHash(String path) throws Exception {
|
||||||
MessageDigest digest = MessageDigest.getInstance("SHA-256");
|
MessageDigest digest = MessageDigest.getInstance("SHA-256");
|
||||||
|
|
||||||
// if (fileEntity.getStatus() == FileStatus.CLOUD) {
|
try (InputStream is = new FileInputStream(path)) {
|
||||||
// File tempFile = cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath());
|
byte[] buffer = new byte[8192];
|
||||||
// try (InputStream is = new FileInputStream(tempFile)) {
|
int read;
|
||||||
// byte[] buffer = new byte[8192];
|
while ((read = is.read(buffer)) > 0) {
|
||||||
// int read;
|
digest.update(buffer, 0, read);
|
||||||
// while ((read = is.read(buffer)) > 0) {
|
}
|
||||||
// digest.update(buffer, 0, read);
|
|
||||||
// }
|
|
||||||
// } finally {
|
|
||||||
// tempFile.delete();
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
try (InputStream is = new FileInputStream(fileEntity.getFilePath())) {
|
|
||||||
byte[] buffer = new byte[8192];
|
|
||||||
int read;
|
|
||||||
while ((read = is.read(buffer)) > 0) {
|
|
||||||
digest.update(buffer, 0, read);
|
|
||||||
}
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] hashBytes = digest.digest();
|
byte[] hashBytes = digest.digest();
|
||||||
|
|||||||
@@ -315,8 +315,11 @@ public class FileUploadServiceImpl implements FileUploadService {
|
|||||||
|
|
||||||
String finalFilePath = assembleFileSynchronously(session);
|
String finalFilePath = assembleFileSynchronously(session);
|
||||||
|
|
||||||
if (!session.getFileType().startsWith("video") && findSimilar == 0) {
|
if (session.getFileType().startsWith("image") && findSimilar == 0) {
|
||||||
checkForDuplicatesSynchronously(finalFilePath);
|
checkForDuplicatesSynchronously(finalFilePath);
|
||||||
|
} else if (session.getFileType().startsWith("audio") || session.getFileType().startsWith("document")
|
||||||
|
&& findSimilar == 0) {
|
||||||
|
fileSimilarityService.hasDuplicatesByHash(finalFilePath, session.getUserId(), session.getFileType());
|
||||||
}
|
}
|
||||||
|
|
||||||
session.setStatus(UploadStatus.COMPLETED);
|
session.setStatus(UploadStatus.COMPLETED);
|
||||||
|
|||||||
Reference in New Issue
Block a user