Files
ErhaCam/src/main/java/Database/PhotoCleaner.java
2025-05-20 09:41:36 +07:00

126 lines
4.7 KiB
Java

package Database;
import Config.SomeCodes;
import org.tinylog.Logger;
import java.nio.file.Path;
import java.time.LocalDateTime;
/**
* PhotoCleaner class
* Responsible for deleting photos older than a certain number of days
*/
public class PhotoCleaner {
private final int days;
private final boolean[] started;
/**
* PhotoCleaner constructor
* @param days how many days old photos to delete
*/
public PhotoCleaner(int days){
this.days = days;
this.started = new boolean[]{false};
}
/**
* Start PhotoCleaner Thread
*/
@SuppressWarnings("BusyWait")
public void Start(){
Thread thread = new Thread(() -> {
started[0] = true;
while (started[0]) {
try {
System.out.println("Rechecking Database for older photos...");
// Delete photos older than the specified number of days
LocalDateTime now = LocalDateTime.now();
// delete from database
Thread sqldelete = new Thread(()->{
Sqlite sql = new Sqlite();
PhotoReviewClass[] prcs = sql.GetAll();
for (PhotoReviewClass prc : prcs) {
if (!started[0]) break;
if (prc != null && prc.getDateTime() != null) {
LocalDateTime ldt = SomeCodes.StringToLocalDateTime(prc.getDateTime());
if (ldt!=null){
if (ldt.isBefore(now.minusDays(days))) {
SomeCodes.Delete(prc.fullres());
SomeCodes.Delete(prc.cropped());
SomeCodes.Delete(prc.compressed());
SomeCodes.Delete(prc.compressedcrop());
SomeCodes.Delete(prc.thumbnails());
sql.Delete(prc);
Logger.info("Deleted PhotoReviewClass: " + prc.getDateTime() + " " + prc.getPrefix());
}
}
}
}
});
RunThread(sqldelete, "DeleteFromDatabase");
// delete from disk
Thread deletefullres = new Thread(new DiskDeleter(SomeCodes.config.getFullQualityDirectory()));
RunThread(deletefullres, "DeleteFullRes");
Thread deletefullrescrop = new Thread(new DiskDeleter(SomeCodes.config.getFullQualityCropDirectory()));
RunThread(deletefullrescrop, "DeleteFullResCrop");
Thread deletecompressed = new Thread(new DiskDeleter(SomeCodes.config.getCompressedDirectory()));
RunThread(deletecompressed, "DeleteCompressed");
Thread deletecompressedcrop = new Thread(new DiskDeleter(SomeCodes.config.getCompressedCropDirectory()));
RunThread(deletecompressedcrop, "DeleteCompressedCrop");
Thread deletethumbnails = new Thread(new DiskDeleter(SomeCodes.config.getThumbsDirectory()));
RunThread(deletethumbnails, "DeleteThumbnails");
// Sleep for 1 hour
Thread.sleep(60 * 60 * 1000);
} catch (Exception e) {
Logger.error("Error in PhotoCleaner Thread: " + e.getMessage());
}
}
System.out.println("PhotoCleaner stopped");
});
thread.setName("PhotoCleaner Thread");
thread.setDaemon(true);
thread.start();
}
private void RunThread(Thread thread, String name){
thread.setName(name);
thread.setDaemon(true);
thread.start();
}
class DiskDeleter implements Runnable{
private final String path;
private final LocalDateTime now ;
public DiskDeleter(String path){
this.path = path;
this.now = LocalDateTime.now();
}
public void run(){
Path[] ppp = SomeCodes.GetFilesInDirectory(path);
if (ppp != null){
for(Path p : ppp){
if (!started[0]) break;
LocalDateTime ldt = SomeCodes.GetCreationTime(p);
if (ldt != null) {
if (ldt.isBefore(now.minusDays(days))) {
SomeCodes.Delete(p);
}
}
}
}
}
}
/**
* Stop PhotoCleaner Thread
*/
public void Stop(){
started[0] = false;
}
}