🔍️ feat: Optimize undownloaded file acquisition logic.

This commit is contained in:
jarvis2f 2025-01-14 18:21:12 +08:00
parent e17930f6f6
commit c92a780245
2 changed files with 66 additions and 15 deletions

View file

@ -223,6 +223,8 @@ public class TdApiHelp {
public T getContent() {
return content;
}
public abstract TdApi.File getFile();
}
public static class PhotoHandler extends FileHandler<TdApi.MessagePhoto> {
@ -263,17 +265,17 @@ public class TdApiHelp {
@Override
public FileRecord convertFileRecord(long telegramId) {
TdApi.PhotoSize photoSize = content.photo.sizes[content.photo.sizes.length - 1];
TdApi.File file = getFile();
return new FileRecord(
getFileId(),
photoSize.photo.remote.uniqueId,
file.remote.uniqueId,
telegramId,
message.chatId,
message.id,
message.date,
message.hasSensitiveContent,
photoSize.photo.size == 0 ? photoSize.photo.expectedSize : photoSize.photo.size,
photoSize.photo.local == null ? 0 : photoSize.photo.local.downloadedSize,
file.size == 0 ? file.expectedSize : file.size,
file.local == null ? 0 : file.local.downloadedSize,
"photo",
null,
null,
@ -285,6 +287,11 @@ public class TdApiHelp {
null
);
}
@Override
public TdApi.File getFile() {
return content.photo.sizes[content.photo.sizes.length - 1].photo;
}
}
public static class VideoHandler extends FileHandler<TdApi.MessageVideo> {
@ -318,7 +325,7 @@ public class TdApiHelp {
@Override
public FileRecord convertFileRecord(long telegramId) {
TdApi.File file = content.video.video;
TdApi.File file = getFile();
return new FileRecord(
file.id,
file.remote.uniqueId,
@ -340,6 +347,11 @@ public class TdApiHelp {
null
);
}
@Override
public TdApi.File getFile() {
return content.video.video;
}
}
public static class AudioHandler extends FileHandler<TdApi.MessageAudio> {
@ -360,7 +372,7 @@ public class TdApiHelp {
@Override
public FileRecord convertFileRecord(long telegramId) {
TdApi.File file = content.audio.audio;
TdApi.File file = getFile();
return new FileRecord(
file.id,
file.remote.uniqueId,
@ -382,6 +394,11 @@ public class TdApiHelp {
null
);
}
@Override
public TdApi.File getFile() {
return content.audio.audio;
}
}
public static class DocumentHandler extends FileHandler<TdApi.MessageDocument> {
@ -402,7 +419,7 @@ public class TdApiHelp {
@Override
public FileRecord convertFileRecord(long telegramId) {
TdApi.File file = content.document.document;
TdApi.File file = getFile();
return new FileRecord(
file.id,
file.remote.uniqueId,
@ -424,6 +441,11 @@ public class TdApiHelp {
null
);
}
@Override
public TdApi.File getFile() {
return content.document.document;
}
}
public static class ComparablePhotoSize implements Comparable<TdApi.PhotoSize> {

View file

@ -259,14 +259,41 @@ public class TelegramVerticle extends AbstractVerticle {
searchChatMessages.limit = Convert.toInt(filter.get("limit"), 20);
searchChatMessages.filter = TdApiHelp.getSearchMessagesFilter(filter.get("type"));
return this.execute(searchChatMessages)
return (Objects.equals(filter.get("status"), FileRecord.DownloadStatus.idle.name()) ?
this.getIdleChatFiles(searchChatMessages) :
this.execute(searchChatMessages))
.compose(foundChatMessages ->
DataVerticle.fileRepository.getFilesByUniqueId(TdApiHelp.getFileUniqueIds(Arrays.asList(foundChatMessages.messages)))
.map(fileRecords -> Tuple.tuple(foundChatMessages, fileRecords)))
.compose(r -> this.convertFiles(r, filter));
.compose(this::convertFiles);
}
}
private Future<TdApi.FoundChatMessages> getIdleChatFiles(TdApi.SearchChatMessages searchChatMessages) {
return this.execute(searchChatMessages)
.compose(foundChatMessages -> {
TdApi.Message[] messages = Stream.of(foundChatMessages.messages)
.filter(message ->
TdApiHelp.getFileHandler(message)
.map(TdApiHelp.FileHandler::getFile)
.map(file -> file.local == null || (
!file.local.isDownloadingActive
&& !file.local.isDownloadingCompleted
&& file.local.downloadedSize == 0
))
.orElse(false)
)
.toArray(TdApi.Message[]::new);
if (ArrayUtil.isEmpty(messages)) {
searchChatMessages.fromMessageId = foundChatMessages.nextFromMessageId;
return getIdleChatFiles(searchChatMessages);
} else {
foundChatMessages.messages = messages;
return Future.succeededFuture(foundChatMessages);
}
});
}
public Future<JsonObject> getChatFilesCount(long chatId) {
return Future.all(
Stream.of(new TdApi.SearchMessagesFilterPhotoAndVideo(),
@ -363,7 +390,13 @@ public class TelegramVerticle extends AbstractVerticle {
TdApi.Message message = results.resultAt(1);
if (file.local != null) {
if (file.local.isDownloadingCompleted) {
return Future.failedFuture("File already downloaded");
return DataVerticle.fileRepository.updateStatus(
file.id,
file.remote.uniqueId,
file.local.path,
FileRecord.DownloadStatus.completed,
System.currentTimeMillis()
).compose(r -> Future.failedFuture("File is already downloaded successfully"));
}
if (file.local.isDownloadingActive) {
return Future.failedFuture("File is downloading");
@ -862,10 +895,9 @@ public class TelegramVerticle extends AbstractVerticle {
));
}
private Future<JsonObject> convertFiles(Tuple2<TdApi.FoundChatMessages, Map<String, FileRecord>> tuple, MultiMap filter) {
private Future<JsonObject> convertFiles(Tuple2<TdApi.FoundChatMessages, Map<String, FileRecord>> tuple) {
TdApi.FoundChatMessages foundChatMessages = tuple.v1;
Map<String, FileRecord> fileRecords = tuple.v2;
boolean searchIdle = Objects.equals(filter.get("status"), FileRecord.DownloadStatus.idle.name());
return DataVerticle.settingRepository.<Boolean>getByKey(SettingKey.uniqueOnly)
.map(uniqueOnly -> {
@ -890,9 +922,6 @@ public class TelegramVerticle extends AbstractVerticle {
} else {
fileRecord = fileRecord.withSourceField(source.id(), source.downloadedSize());
}
if (searchIdle && !Objects.equals(fileRecord.downloadStatus(), FileRecord.DownloadStatus.idle.name())) {
return null;
}
//TODO Processing of the same file under different accounts