去除链接伪装;更新前端,正式启用下载模式(仅预览,仅下载,全部);删除只能全部删除;下载前能够查看缩略图

This commit is contained in:
chuzhongzai 2023-12-21 18:39:19 +08:00
parent 2c08552986
commit e1afc3a6c5
14 changed files with 130 additions and 166 deletions

View File

@ -39,9 +39,6 @@ public class GalleryManageController {
@RequestParam(value = "mode", defaultValue = "3", required = false)String mode){
if(link == null || targetResolution == null)
return Response._failure("参数不全");
link = customUtil.restoreUrl(link);
if(link == null)
return Response._failure("链接错误");
return galleryManageService.createTask(link, targetResolution, AuthCode, tags, Byte.parseByte(mode));
}
@ -58,9 +55,6 @@ public class GalleryManageController {
return Response._failure("参数不全");
switch (type) {
case "link" -> {
param = customUtil.restoreUrl(param);
if (param == null)
return Response._failure("链接错误");
return galleryManageService.selectTaskByLink(param);
}
case "gid" -> {
@ -85,11 +79,11 @@ public class GalleryManageController {
}
@DeleteMapping("")
public String deleteTask(Integer gid, String AuthCode, @RequestParam(value = "mode", defaultValue = "3", required = false)String mode){
public String deleteTask(Integer gid, String AuthCode){
if(gid == null)
return Response._failure("参数不全");
return galleryManageService.deleteGalleryByGid(gid, AuthCode, Byte.parseByte(mode));
return galleryManageService.deleteGalleryByGid(gid, AuthCode);
}

View File

@ -9,8 +9,8 @@ public interface GalleryMapper {
@Insert("insert into gallery" +
" (gid, name, link, language, pages, status, fileSize, createTime, proceeding, resolution, displayFileSize, downloader, mode)\n" +
" values (#{gid}, #{name}, #{link}, #{language}, #{pages}, #{status}, #{fileSize}, #{createTime}, #{proceeding}, #{resolution}, #{displayFileSize}, #{downloader}, #{mode})")
" (gid, name, link, language, pages, status, fileSize, createTime, proceeding, resolution, displayFileSize, downloader, mode, thumb_link)\n" +
" values (#{gid}, #{name}, #{link}, #{language}, #{pages}, #{status}, #{fileSize}, #{createTime}, #{proceeding}, #{resolution}, #{displayFileSize}, #{downloader}, #{mode}, #{thumb_link})")
void insertGallery(Gallery gallery);
@Select("select * from gallery where link=#{link}")

View File

@ -12,6 +12,11 @@ import java.util.Map;
@Data
public class Gallery {
public static byte VIEW = 0;
public static byte SOURCE = 1;
public static byte PREVIEW = 2;
public static byte ALL = 3;
@JsonProperty("name")
private String name; //本子名字
@ -66,5 +71,9 @@ public class Gallery {
@JsonProperty("mode")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private byte mode; //rd 可读可下载 r可读 d可下载
private byte mode; //0 仅查看 1 仅下载源文件 2 仅存储预览图 3 全部
@JsonProperty("thumb_link")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private String thumb_link;
}

View File

@ -7,14 +7,5 @@ public class DeleteGalleryMessage extends AbstractMessage{
{
messageType = DELETE_GALLERY_MESSAGE;
}
public static final byte DELETE_ALL = 3;
public static final byte DELETE_PREVIEW = 2;
public static final byte DELETE_SOURCE = 1;
byte deleteType;
String galleryName;
}

View File

@ -58,7 +58,7 @@ public class GalleryManageService {
PushService pushService;
public GalleryManageService(GalleryMapper galleryMapper, CollectMapper collectMapper, CustomConfigurationMapper configurationMapper, UserMapper userMapper, ShareFileMapper shareFileMapper,
TagMapper tagMapper, PageNameCacheMapper pageNameCacheMapper, RemoteService remoteService, PushService pushService){
TagMapper tagMapper, PageNameCacheMapper pageNameCacheMapper, RemoteService remoteService, PushService pushService) {
this.galleryMapper = galleryMapper;
this.collectMapper = collectMapper;
this.configurationMapper = configurationMapper;
@ -72,17 +72,17 @@ public class GalleryManageService {
/**
* 创建任务
* @param link 任务链接
* @param targetResolution 目标分辨率
* @param AuthCode 授权码用于记录是谁下载的
* @return 提交结果
* @param link 任务链接
* @param targetResolution 目标分辨率
* @param AuthCode 授权码用于记录是谁下载的
* @return 提交结果
*/
public String createTask(String link, String targetResolution, String AuthCode, List<Integer> tidS, byte mode){
public String createTask(String link, String targetResolution, String AuthCode, List<Integer> tidS, byte mode) {
Response response = Response.generateResponse();
User user = userMapper.selectUserByAuthCode(AuthCode);
// return Response._failure("调试中,请勿提交任务");
if(remoteService.isDead()) {
if (remoteService.isDead()) {
response.failure("节点挂了,找狮子处理");
pushService.taskCreateReport(user.getUsername(), link, response);
return response.toJSONString();
@ -90,7 +90,7 @@ public class GalleryManageService {
int gid;
try {
gid = Integer.parseInt(link.split("/")[4]);
}catch (NumberFormatException e){
} catch (NumberFormatException e) {
response.failure("链接错误");
pushService.taskCreateReport(user.getUsername(), link, response);
return response.toJSONString();
@ -98,7 +98,7 @@ public class GalleryManageService {
Gallery gallery;
//判断数据库中是否有这个任务有则返回状态
if((gallery = galleryMapper.selectGalleryByGid(gid)) != null){
if ((gallery = galleryMapper.selectGalleryByGid(gid)) != null) {
response.failure("任务队列已有此任务,任务状态: " + gallery.getStatus() + " 请点击查找任务");
pushService.taskCreateReport(user.getUsername(), link, response);
return response.toJSONString();
@ -107,26 +107,26 @@ public class GalleryManageService {
//尝试下载本子返回结果
try {
gallery = GalleryUtil.parse(link, true, targetResolution);
if(gallery == null){
if (gallery == null) {
log.error("创建任务: {},解析失败", link);
response.failure("任务解析失败,未知原因,请检查链接是否正常");
pushService.taskCreateReport(user.getUsername(), link, response);
return response.toJSONString();
}else{
} else {
log.info("创建任务: {} 目标分辨率:{}", link, targetResolution);
if(remoteService.addGalleryToQueue(gallery, mode) != 0){
if (remoteService.addGalleryToQueue(gallery, mode) != 0) {
log.error("传送任务{}失败, 未知原因", gallery.getName());
response.failure("任务传送失败,未知原因");
pushService.taskCreateReport(user.getUsername(), link, response);
return response.toJSONString();
}
}
}catch (ResolutionNotMatchException e){
} catch (ResolutionNotMatchException e) {
e.printStackTrace();
response.failure("提交失败,分辨率不存在");
pushService.taskCreateReport(user.getUsername(), link, response);
return response.toJSONString();
}catch (IOException e){
} catch (IOException e) {
e.printStackTrace();
response.failure("IO错误可能是网络波动");
pushService.taskCreateReport(user.getUsername(), link, response);
@ -134,7 +134,7 @@ public class GalleryManageService {
}
//处理下载结果将任务插入数据库并且更新每周用量
if(gallery.getStatus().equals("已提交")) {
if (gallery.getStatus().equals("已提交")) {
response.success(gallery.toString());
gallery.setDownloader(user.getId());
gallery.setMode(mode);
@ -143,12 +143,11 @@ public class GalleryManageService {
long usedAmount = Long.parseLong(configurationMapper.selectConfiguration(CustomConfiguration.WEEK_USED_AMOUNT).getValue());
usedAmount += gallery.getFileSize();
configurationMapper.updateConfiguration(CustomConfiguration.WEEK_USED_AMOUNT, String.valueOf(usedAmount));
if(tidS != null)
if (tidS != null)
for (Integer tid : tidS)
if(tagMapper.selectTagExistById(tid) > 0)
if (tagMapper.selectTagExistById(tid) > 0)
tagMapper.markTag(gallery.getGid(), tid);
}
else{
} else {
response.failure("提交失败,未知原因");
galleryMapper.deleteGalleryByGid(gallery.getGid());
}
@ -159,15 +158,15 @@ public class GalleryManageService {
/**
* 根据链接查询本子
* @param link 链接
* @param link 链接
* @return 查询结果
*/
public String selectTaskByLink(String link) {
Response response = Response.generateResponse();
Integer gid = parseGid(link);
Gallery gallery;
if(gid != null)
gallery = galleryMapper.selectGalleryByGid(gid);
if (gid != null)
gallery = galleryMapper.selectGalleryByGid(gid);
else {
response.failure("链接错误");
return response.toJSONString();
@ -175,15 +174,15 @@ public class GalleryManageService {
log.info("查询{}", link);
//判断数据库中是否有这个任务如果有则返回如果没有则直接查询
if(gallery == null)
try{
if (gallery == null)
try {
gallery = GalleryUtil.parse(link, false, null);
if(gallery != null)
if (gallery != null)
response.success(new ObjectMapper().valueToTree(gallery).toString());
else
response.failure("查询失败");
} catch (Exception e) {
e.printStackTrace();
log.info(e.getMessage());
response.failure("查询失败");
}
@ -195,14 +194,15 @@ public class GalleryManageService {
/**
* 通过gid查询本子
*
* @param gid gid
* @return 查询结果
*/
public String selectTaskByGid(int gid){
public String selectTaskByGid(int gid) {
Response response = Response.generateResponse();
Gallery gallery = galleryMapper.selectGalleryByGid(gid);
if(gallery == null)
if (gallery == null)
response.failure("未找到该本子,请使用链接");
else
@ -213,13 +213,14 @@ public class GalleryManageService {
/**
* 查询所有本子
*
* @return 查询结果
*/
public String selectAllGallery(int userId) {
Response response = Response.generateResponse();
Gallery[] galleries = galleryMapper.selectAllGallery();
if(galleries == null){
if (galleries == null) {
response.failure("没有找到本子");
return response.toJSONString();
}
@ -227,16 +228,16 @@ public class GalleryManageService {
ArrayList<Integer> galleryIds = collectMapper.selectGidByCollector(userId);
Iterator<Integer> idIterator;
if(!galleryIds.isEmpty()) //如果该用户收藏了本子
galleryLoop: for (Gallery gallery : galleries) { //遍历本子
if (!galleryIds.isEmpty()) //如果该用户收藏了本子
galleryLoop:for (Gallery gallery : galleries) { //遍历本子
idIterator = galleryIds.iterator();
while (idIterator.hasNext()){ //遍历收藏的gid
while (idIterator.hasNext()) { //遍历收藏的gid
Integer id = idIterator.next();
if(id.equals(gallery.getGid())){ //如果找到对应的gid,修改对应本子的属性删除当前gid判断是否需要跳出或者结束循环
if (id.equals(gallery.getGid())) { //如果找到对应的gid,修改对应本子的属性删除当前gid判断是否需要跳出或者结束循环
gallery.setCollect(true);
idIterator.remove();
if(galleryIds.isEmpty())
if (galleryIds.isEmpty())
break galleryLoop;
else
continue galleryLoop;
@ -255,7 +256,7 @@ public class GalleryManageService {
ArrayList<Integer> temp;
for (Gallery gallery : galleries) {
if((temp = tagsMap.get(gallery.getGid())) != null) {
if ((temp = tagsMap.get(gallery.getGid())) != null) {
gallery.setTags(new ArrayList<>());
gallery.getTags().addAll(temp);
}
@ -267,13 +268,14 @@ public class GalleryManageService {
/**
* 查询未完成的本子
*
* @return 查询结果
*/
public String selectUnDoneGallery() {
Response response = Response.generateResponse();
Gallery[] galleries = galleryMapper.selectUnDoneGalleries();
if(galleries.length > 0)
if (galleries.length > 0)
response.success(new ObjectMapper().valueToTree(galleries).toString());
else
response.failure();
@ -283,6 +285,7 @@ public class GalleryManageService {
/**
* 通过本子名查询本子
*
* @param name 名字
* @return 查询结果
*/
@ -290,7 +293,7 @@ public class GalleryManageService {
Response response = Response.generateResponse();
Gallery gallery = galleryMapper.selectGalleryByName("%" + name + "%");
if(gallery != null)
if (gallery != null)
response.success(new ObjectMapper().valueToTree(gallery).toString());
else
response.failure("没有找到该名字的本子");
@ -300,14 +303,15 @@ public class GalleryManageService {
/**
* 查询用户下载的本子
* @param AuthCode 授权码用于查询用户名
* @return 查询结果
*
* @param AuthCode 授权码用于查询用户名
* @return 查询结果
*/
public String selectGalleryByDownloader(String AuthCode){
public String selectGalleryByDownloader(String AuthCode) {
Response response = Response.generateResponse();
Gallery[] galleries = galleryMapper.selectGalleryByDownloader(userMapper.selectUserByAuthCode(AuthCode).getId());
if(galleries.length > 0)
if (galleries.length > 0)
response.success(new ObjectMapper().valueToTree(galleries).toString());
else
response.failure("您未下载本子");
@ -365,67 +369,45 @@ public class GalleryManageService {
/**
* 删除本子以及对应的文件如果存在的话
*
* @param gid gid
* @return 删除结果
*/
public String deleteGalleryByGid(Integer gid, String AuthCode, byte mode) {
public String deleteGalleryByGid(Integer gid, String AuthCode) {
Response response = Response.generateResponse();
String deleteType;
Gallery gallery = galleryMapper.selectGalleryByGid(gid);
User user = userMapper.selectUserByAuthCode(AuthCode);
if(gallery == null){
if (gallery == null) {
response.failure("删除失败,该本子不存在");
return response.toJSONString();
}
ArrayList<Integer> collector = collectMapper.selectCollectorByGid(gallery.getGid());
if(!(collector.isEmpty() || collector.size() == 1 && collector.get(0).equals(user.getId()) //判断收藏
&& gallery.getDownloader() == user.getId())) //判断下载
if (!(collector.isEmpty() || collector.size() == 1 && collector.get(0).equals(user.getId()) //判断收藏
&& gallery.getDownloader() == user.getId())) //判断下载
response.failure("删除失败,该本子已被别人收藏或你不是下载人");
else {
log.info("删除本子{}", gallery.getName());
galleryMapper.deleteGalleryByGid(gallery.getGid()); //删除本子记录
ArrayList<Integer> tidS = tagMapper.selectTagByGid(gallery.getGid());
for (Integer tid : tidS)
tagMapper.decrTagUsage(tid);
else{
if((gallery.getMode() & mode) == 0) { //不能删除对应的因为对应的没有
if (mode == 1)
response.failure("无法删除该本子的源文件,不存在");
else if (mode == 2)
response.failure("无法删除该本子的预览图,不存在");
} else {
log.info("删除本子{}, mode:{}, delete_mode:{}", gallery.getName(), gallery.getMode(), mode);
gallery.setMode((byte) (gallery.getMode() ^ mode));
if(gallery.getMode() == 0) { //删整个本子
galleryMapper.deleteGalleryByGid(gallery.getGid()); //删除本子记录
ArrayList<Integer> tidS = tagMapper.selectTagByGid(gallery.getGid());
for (Integer tid : tidS)
tagMapper.decrTagUsage(tid);
tagMapper.disMarkTagByGid(gallery.getGid()); //删除本子标记
gid2name_cache.remove(gallery.getGid()); //删除本子缓存
page2pageNameCache.remove(gallery.getName()); //移除页数缓存
pageNameCacheMapper.deletePageNameByGid(gid);
tagMapper.disMarkTagByGid(gallery.getGid()); //删除本子标记
gid2name_cache.remove(gallery.getGid()); //删除本子缓存
page2pageNameCache.remove(gallery.getName()); //移除页数缓存
pageNameCacheMapper.deletePageNameByGid(gid);
if(new File(TargetPath + "/" + gallery.getName()).isDirectory()) //删除本地缓存
FileUtil.del(TargetPath + "/" + gallery.getName());
deleteType = "全部";
}else{
if(mode == 2 && new File(TargetPath + "/" + gallery.getName()).isDirectory()) { //删除预览缓存
FileUtil.del(TargetPath + "/" + gallery.getName());
gid2name_cache.remove(gallery.getGid()); //删除本子缓存
page2pageNameCache.remove(gallery.getName()); //移除页数缓存
}
galleryMapper.updateGallery(gallery);
deleteType = (mode == 1? "源文件": "预览图"); //用于提示
}
switch (remoteService.deleteGallery(gallery, mode)){
case ErrorCode.IO_ERROR -> response.failure("本子:" + gallery.getName() + deleteType + "删除失败IO错误");
case ErrorCode.FILE_NOT_FOUND -> response.failure("本子:" + gallery.getName() + deleteType + "删除失败,文件不存在");
case 0 -> response.success();
}
if(response.get("result").equals("failure"))
log.info(response.getResult());
}
if (new File(TargetPath + "/" + gallery.getName()).isDirectory()) //删除本地缓存
FileUtil.del(TargetPath + "/" + gallery.getName());
}
switch (remoteService.deleteGallery(gallery)) {
case ErrorCode.IO_ERROR -> response.failure("本子:" + gallery.getName() + "删除失败IO错误");
case ErrorCode.FILE_NOT_FOUND -> response.failure("本子:" + gallery.getName() + "删除失败,文件不存在");
case 0 -> response.success();
}
if (response.get("result").equals("failure"))
log.info(response.getResult());
return response.toJSONString();
}

View File

@ -109,6 +109,8 @@ public class QueryService {
else{ // transfer image and save it as cache
log.info("miss cache:{}", imageName);
try {
if(!path.startsWith("/t"))
path = "/t" + path;
requests("https://s.exhentai.org" + path, true, response, new FileOutputStream(image));
}catch (IOException e){
e.printStackTrace();

View File

@ -130,10 +130,9 @@ public class RemoteService {
}
}
public byte deleteGallery(Gallery gallery, byte type){
public byte deleteGallery(Gallery gallery){
DeleteGalleryMessage dgm = new DeleteGalleryMessage();
dgm.setGalleryName(gallery.getName());
dgm.setDeleteType(type);
dgm.messageId = atomicInteger.getAndIncrement();
channel.writeAndFlush(dgm);

View File

@ -29,25 +29,6 @@ public class CustomUtil {
public static ObjectMapper objectMapper = new ObjectMapper();
private MaskDomain[] maskDomains;
public String restoreUrl(String link){
URL url;
try {
url = new URL(link);
}catch (MalformedURLException e){
return null;
}
for(MaskDomain maskDomain: maskDomains){
if(url.getHost().equals(maskDomain.getMask())){
return link.replace(maskDomain.getMask(), maskDomain.getRaw());
}
else if(url.getHost().equals(maskDomain.getRaw())){
return link;
}
}
return null;
}
public static String fileSizeToString(long fileSize){
if (fileSize < ONE_KB) {

View File

@ -2,6 +2,7 @@ package com.lion.lionwebsite.Util;
import com.lion.lionwebsite.Domain.Gallery;
import com.lion.lionwebsite.Exception.ResolutionNotMatchException;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
@ -18,7 +19,7 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
@Slf4j
public class GalleryUtil {
static String EX_HENTAI = "https://exhentai.org";
@ -68,6 +69,10 @@ public class GalleryUtil {
gallery.setFileSize(CustomUtil.stringToFileSize(galleryDoc.select("#gdd > table > tbody > tr:nth-child(5) > td.gdt2").text().replace(" ", "")));
gallery.setDisplayFileSize(CustomUtil.fileSizeToString(gallery.getFileSize()));
String thumb_link = galleryDoc.select("#gd1 > div").get(0).attr("style");
thumb_link = thumb_link.substring(thumb_link.indexOf("url(") + 4, thumb_link.lastIndexOf(")")).replace("https://s.exhentai.org/t", "");
gallery.setThumb_link(thumb_link);
//查找下载页面链接并初始化参数
String download_link = galleryDoc.select("#gd5 > p:nth-child(2) > a").attr("onclick").split("'")[1];
HashMap<String, String> extraProperties = new HashMap<>();
@ -143,8 +148,8 @@ public class GalleryUtil {
Document document = Jsoup.parse(page);
Elements select = document.select("#gnd");
if(select.size() > 0)
return select.select("a").get(0).attributes().get("href");
if(!select.isEmpty())
return select.select("a").getFirst().attributes().get("href");
return null;
}
@ -190,7 +195,8 @@ public class GalleryUtil {
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
headers.put("Upgrade-Insecure-Requests", "1");
headers.put("Cookie", "ipb_member_id=5774855; ipb_pass_hash=4b061c3abe25289568b5a8e0123fb3b9; igneous=cea2e08fb; sk=oye107wk02gtomb56x65dmv4qzbn; nw=1");
if(url.contains("exhentai"))
headers.put("Cookie", "ipb_member_id=5774855; ipb_pass_hash=4b061c3abe25289568b5a8e0123fb3b9; igneous=cea2e08fb; sk=oye107wk02gtomb56x65dmv4qzbn; nw=1");
if(extraProperties != null)
headers.putAll(extraProperties);

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long