Skip to content
Open

index #305

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions src/main/java/cn/har01d/alist_tvbox/entity/Index.java
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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<Index, Integer> {
List<Index> findByPathStartsWith(String path);
}
39 changes: 36 additions & 3 deletions src/main/java/cn/har01d/alist_tvbox/service/AListService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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<String, VideoPreview> 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)
Expand All @@ -62,6 +68,7 @@ public AListService(RestTemplateBuilder builder, SiteService siteService, AppPro
.build();
this.siteService = siteService;
this.appProperties = appProperties;
this.indexRepository = indexRepository;
}

public List<SearchResult> search(Site site, String keyword) {
Expand Down Expand Up @@ -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) {
Expand All @@ -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<FsInfo> files) {
if (files == null || files.isEmpty()) {
return;
}
List<Index> existing = indexRepository.findByPathStartsWith(path);
Map<String, Index> map = existing.stream().collect(Collectors.toMap(Index::getPath, e -> e));
List<Index> 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<FsInfo> filter(List<FsInfo> files) {
return files.stream().filter(e -> include(e.getName())).collect(Collectors.toList());
}
Expand Down