From 2187519abcffc6a3f4a4d85f75369f481388fad9 Mon Sep 17 00:00:00 2001 From: MrLetsplay Date: Tue, 18 Feb 2025 20:37:11 +0100 Subject: [PATCH] Make all config options except libraryPath optional, Add in-memory thumbnail cache, Add excludePaths & .nomedia to exclude paths --- .../java/me/mrletsplay/videobase/Config.java | 20 ++++++++ .../me/mrletsplay/videobase/VideoBase.java | 5 +- .../mrletsplay/videobase/library/Library.java | 26 +++++++--- .../videobase/library/LibraryMetadata.java | 11 +++++ .../mrletsplay/videobase/rest/LibraryAPI.java | 3 +- .../videobase/util/ThumbnailCreator.java | 48 ++++++++++++++----- 6 files changed, 92 insertions(+), 21 deletions(-) diff --git a/src/main/java/me/mrletsplay/videobase/Config.java b/src/main/java/me/mrletsplay/videobase/Config.java index 43a3878..9259ec1 100644 --- a/src/main/java/me/mrletsplay/videobase/Config.java +++ b/src/main/java/me/mrletsplay/videobase/Config.java @@ -1,11 +1,18 @@ package me.mrletsplay.videobase; +import java.util.List; +import java.util.Objects; + +import me.mrletsplay.mrcore.json.JSONType; import me.mrletsplay.mrcore.json.converter.JSONConstructor; import me.mrletsplay.mrcore.json.converter.JSONConvertible; +import me.mrletsplay.mrcore.json.converter.JSONListType; import me.mrletsplay.mrcore.json.converter.JSONValue; public class Config implements JSONConvertible { + public static final List DEFAULT_FILE_TYPES = List.of("mp4", "mpeg", "mkv", "flv", "avi", "webm"); + @JSONValue private String libraryPath; @@ -15,6 +22,10 @@ public class Config implements JSONConvertible { @JSONValue private String cachePath; + @JSONValue + @JSONListType(JSONType.STRING) + private List includeFileTypes; + @JSONConstructor private Config() {} @@ -30,11 +41,20 @@ public class Config implements JSONConvertible { return cachePath; } + public List getIncludeFileTypes() { + return includeFileTypes == null ? DEFAULT_FILE_TYPES : includeFileTypes; + } + + public void validate() { + Objects.requireNonNull(libraryPath, "libraryPath"); + } + public static Config createDefault() { Config config = new Config(); config.libraryPath = "library"; config.readOnly = false; config.cachePath = "cache"; + config.includeFileTypes = DEFAULT_FILE_TYPES; return config; } diff --git a/src/main/java/me/mrletsplay/videobase/VideoBase.java b/src/main/java/me/mrletsplay/videobase/VideoBase.java index ffcbaac..3e7e54d 100644 --- a/src/main/java/me/mrletsplay/videobase/VideoBase.java +++ b/src/main/java/me/mrletsplay/videobase/VideoBase.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Objects; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -20,6 +19,7 @@ import me.mrletsplay.simplehttpserver.http.cors.CorsConfiguration; import me.mrletsplay.simplehttpserver.http.server.HttpServer; import me.mrletsplay.videobase.library.Library; import me.mrletsplay.videobase.rest.LibraryAPI; +import me.mrletsplay.videobase.util.ThumbnailCreator; public class VideoBase { @@ -48,6 +48,7 @@ public class VideoBase { } config = JSONConverter.decodeObject(new JSONObject(Files.readString(configPath, StandardCharsets.UTF_8)), Config.class); + config.validate(); } catch (IOException e) { LOGGER.error("Failed to load config", e); System.exit(1); @@ -82,8 +83,8 @@ public class VideoBase { } private static void loadLibrary() { - Objects.requireNonNull(config.getLibraryPath(), "libraryPath"); library = Library.load(Path.of(config.getLibraryPath()), config.isReadOnly()); + ThumbnailCreator.clearCache(); } } diff --git a/src/main/java/me/mrletsplay/videobase/library/Library.java b/src/main/java/me/mrletsplay/videobase/library/Library.java index b98b7aa..e69757c 100644 --- a/src/main/java/me/mrletsplay/videobase/library/Library.java +++ b/src/main/java/me/mrletsplay/videobase/library/Library.java @@ -113,6 +113,10 @@ public class Library { private static void load(Path rootPath, Path path, List