From 9bb28a74b4495892563f6c80509db1684dbe0f79 Mon Sep 17 00:00:00 2001 From: Harold Date: Sun, 5 May 2024 10:31:55 +0800 Subject: [PATCH] index --- .../cn/har01d/alist_tvbox/entity/Index.java | 30 ++++++++++++++ .../alist_tvbox/entity/IndexRepository.java | 9 +++++ .../alist_tvbox/service/AListService.java | 39 +++++++++++++++++-- 3 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 src/main/java/cn/har01d/alist_tvbox/entity/Index.java create mode 100644 src/main/java/cn/har01d/alist_tvbox/entity/IndexRepository.java diff --git a/src/main/java/cn/har01d/alist_tvbox/entity/Index.java b/src/main/java/cn/har01d/alist_tvbox/entity/Index.java new file mode 100644 index 0000000000..6c17ad3314 --- /dev/null +++ b/src/main/java/cn/har01d/alist_tvbox/entity/Index.java @@ -0,0 +1,30 @@ +package cn.har01d.alist_tvbox.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.TableGenerator; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +import java.time.Instant; + +@Getter +@Setter +@ToString +@RequiredArgsConstructor +@Entity +@TableGenerator(name = "tableGenerator", table = "id_generator", pkColumnName = "entity_name", valueColumnName = "next_id", allocationSize = 1) +public class Index { + @Id + @GeneratedValue(strategy = GenerationType.TABLE, generator = "tableGenerator") + private Integer id; + private Integer version = 1; + @Column(unique = true) + private String path; + private Instant time; +} diff --git a/src/main/java/cn/har01d/alist_tvbox/entity/IndexRepository.java b/src/main/java/cn/har01d/alist_tvbox/entity/IndexRepository.java new file mode 100644 index 0000000000..bffc471bf8 --- /dev/null +++ b/src/main/java/cn/har01d/alist_tvbox/entity/IndexRepository.java @@ -0,0 +1,9 @@ +package cn.har01d.alist_tvbox.entity; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface IndexRepository extends JpaRepository { + List findByPathStartsWith(String path); +} diff --git a/src/main/java/cn/har01d/alist_tvbox/service/AListService.java b/src/main/java/cn/har01d/alist_tvbox/service/AListService.java index 041e797f82..1454b12d56 100644 --- a/src/main/java/cn/har01d/alist_tvbox/service/AListService.java +++ b/src/main/java/cn/har01d/alist_tvbox/service/AListService.java @@ -2,6 +2,8 @@ import cn.har01d.alist_tvbox.config.AppProperties; import cn.har01d.alist_tvbox.dto.FileItem; +import cn.har01d.alist_tvbox.entity.Index; +import cn.har01d.alist_tvbox.entity.IndexRepository; import cn.har01d.alist_tvbox.entity.Site; import cn.har01d.alist_tvbox.model.FsDetail; import cn.har01d.alist_tvbox.model.FsDetailResponse; @@ -34,8 +36,11 @@ import org.springframework.web.client.RestTemplate; import java.time.Duration; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -48,12 +53,13 @@ public class AListService { private final RestTemplate restTemplate; private final SiteService siteService; private final AppProperties appProperties; + private final IndexRepository indexRepository; private final Cache cache = Caffeine.newBuilder() .maximumSize(10) .expireAfterWrite(Duration.ofSeconds(895)) .build(); - public AListService(RestTemplateBuilder builder, SiteService siteService, AppProperties appProperties) { + public AListService(RestTemplateBuilder builder, SiteService siteService, AppProperties appProperties, IndexRepository indexRepository) { this.restTemplate = builder .defaultHeader(HttpHeaders.ACCEPT, Constants.ACCEPT) .defaultHeader(HttpHeaders.USER_AGENT, Constants.USER_AGENT) @@ -62,6 +68,7 @@ public AListService(RestTemplateBuilder builder, SiteService siteService, AppPro .build(); this.siteService = siteService; this.appProperties = appProperties; + this.indexRepository = indexRepository; } public List search(Site site, String keyword) { @@ -110,7 +117,11 @@ public FsResponse listFiles(Site site, String path, int page, int size) { FsListResponse response = post(site, url, request, FsListResponse.class); logError(response); log.debug("list files: {} {}", path, response.getData()); - return getFiles(version, response.getData()); + FsResponse result = getFiles(version, response.getData()); + if (path.startsWith("/πŸˆ΄ζˆ‘ηš„ι˜Ώι‡Œεˆ†δΊ«/")) { + index(path, result.getFiles()); + } + return result; } private FsResponse getFiles(int version, FsResponse response) { @@ -121,13 +132,35 @@ private FsResponse getFiles(int version, FsResponse response) { for (FsInfo fsInfo : response.getFiles()) { fsInfo.setThumb(fsInfo.getThumbnail()); } - } else if (response != null && response.getContent() != null) { + } else if (response.getContent() != null) { response.setFiles(response.getContent()); } response.setFiles(filter(response.getFiles())); return response; } + private void index(String path, List files) { + if (files == null || files.isEmpty()) { + return; + } + List existing = indexRepository.findByPathStartsWith(path); + Map map = existing.stream().collect(Collectors.toMap(Index::getPath, e -> e)); + List list = new ArrayList<>(); + for (FsInfo info : files) { + String newPath = path + "/" + info.getName(); + Index index = map.get(newPath); + if (index == null) { + index = new Index(); + index.setPath(newPath); + index.setTime(LocalDateTime.parse(info.getModified()).atZone(ZoneId.systemDefault()).toInstant()); + } else { + index.setVersion(index.getVersion() + 1); + } + list.add(index); + } + indexRepository.saveAll(list); + } + private List filter(List files) { return files.stream().filter(e -> include(e.getName())).collect(Collectors.toList()); }