diff --git a/backend/pom.xml b/backend/pom.xml
index ad668cb..3aa49e7 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -7,7 +7,7 @@
gameyfin
de.grimsi
- 1.2.1
+ 1.2.2-SNAPSHOT
gameyfin-backend
@@ -17,7 +17,7 @@
18
- 1.6.9
+ 1.6.11
1.7.1
2.11.0
1.21
diff --git a/backend/src/main/java/de/grimsi/gameyfin/config/FilesystemConfig.java b/backend/src/main/java/de/grimsi/gameyfin/config/FilesystemConfig.java
index 10df1fc..54801b2 100644
--- a/backend/src/main/java/de/grimsi/gameyfin/config/FilesystemConfig.java
+++ b/backend/src/main/java/de/grimsi/gameyfin/config/FilesystemConfig.java
@@ -2,16 +2,25 @@ package de.grimsi.gameyfin.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
+import org.springframework.context.event.EventListener;
import org.springframework.core.env.*;
import org.springframework.util.PropertyPlaceholderHelper;
import org.springframework.util.StringUtils;
+import javax.annotation.PostConstruct;
import javax.sql.DataSource;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.LinkOption;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Properties;
import java.util.stream.StreamSupport;
@@ -19,6 +28,8 @@ import java.util.stream.StreamSupport;
@Configuration
public class FilesystemConfig {
+ private static final String INTERNAL_FOLDER_NAME = ".gameyfin";
+
@Value("#{'${gameyfin.sources}'.split(',')[0]}")
private String firstLibraryPath;
@@ -31,16 +42,29 @@ public class FilesystemConfig {
@Autowired
Environment env;
+ /**
+ * This will make sure that the internal folder (".gameyfin") is marked as hidden on DOS/Windows-based systems.
+ * On UNIX-based systems files and folders starting with a dot are hidden
+ */
+ @EventListener(ApplicationReadyEvent.class)
+ public void hideInternalFolderOnDOS() throws IOException {
+ Path internalFolder = Paths.get("%s/%s".formatted(firstLibraryPath, INTERNAL_FOLDER_NAME));
+
+ if(!Files.exists(internalFolder) || !Files.isDirectory(internalFolder)) return;
+
+ Files.setAttribute(internalFolder, "dos:hidden", Boolean.TRUE, LinkOption.NOFOLLOW_LINKS);
+ }
+
@Autowired
public void setConfigurableEnvironment(ConfigurableEnvironment env) {
Properties props = new Properties();
if(!StringUtils.hasText(dbPath)) {
- props.setProperty("gameyfin.db", "%s/.gameyfin/db".formatted(firstLibraryPath));
+ props.setProperty("gameyfin.db", "%s/%s/db".formatted(firstLibraryPath, INTERNAL_FOLDER_NAME));
}
if(!StringUtils.hasText(cachePath)) {
- props.setProperty("gameyfin.cache", "%s/.gameyfin/cache".formatted(firstLibraryPath));
+ props.setProperty("gameyfin.cache", "%s/%s/cache".formatted(firstLibraryPath, INTERNAL_FOLDER_NAME));
}
env.getPropertySources().addFirst(new PropertiesPropertySource("gameyfinFilesystemProperties", props));
diff --git a/backend/src/main/java/de/grimsi/gameyfin/service/LibraryService.java b/backend/src/main/java/de/grimsi/gameyfin/service/LibraryService.java
index a171e0e..9ecf99d 100644
--- a/backend/src/main/java/de/grimsi/gameyfin/service/LibraryService.java
+++ b/backend/src/main/java/de/grimsi/gameyfin/service/LibraryService.java
@@ -16,8 +16,10 @@ import org.springframework.stereotype.Service;
import org.springframework.util.StopWatch;
import java.io.IOException;
+import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@@ -46,7 +48,28 @@ public class LibraryService {
folder -> {
try (Stream stream = Files.list(folder)) {
// return all sub-folders (non-recursive) and files that have an extension that indicates that they are a downloadable file
- List gameFilesFromThisFolder = stream.filter(p -> Files.isDirectory(p) || hasGameArchiveExtension(p)).toList();
+ List gameFilesFromThisFolder = stream
+ .filter(p -> Files.isDirectory(p) || hasGameArchiveExtension(p))
+ // filter out all hidden files and folders
+ .filter(p -> {
+ try {
+ return !(Files.isHidden(p));
+ } catch (IOException e) {
+ throw new RuntimeException("Error while checking if '%s' is hidden.".formatted(p), e);
+ }
+ })
+ // filter out all empty directories
+ .filter(p -> {
+ if(!Files.isDirectory(p)) return true;
+
+ try(DirectoryStream s = Files.newDirectoryStream(p)) {
+ return s.iterator().hasNext();
+ } catch(IOException e) {
+ throw new RuntimeException("Error while checking if folder '%s' is empty.".formatted(p), e);
+ }
+ })
+ .toList();
+
gamefiles.addAll(gameFilesFromThisFolder);
} catch (IOException e) {
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 5d66472..7f2a857 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "frontend",
- "version": "1.2.1",
+ "version": "1.2.2-SNAPSHOT",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "frontend",
- "version": "1.2.1",
+ "version": "1.2.2-SNAPSHOT",
"dependencies": {
"@angular/animations": "^14.0.0",
"@angular/cdk": "^14.1.0",
diff --git a/frontend/package.json b/frontend/package.json
index e6137b3..bfe88ad 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "frontend",
- "version": "1.2.1",
+ "version": "1.2.2-SNAPSHOT",
"scripts": {
"ng": "ng",
"start": "ng serve",
diff --git a/frontend/pom.xml b/frontend/pom.xml
index d3e8103..a187801 100644
--- a/frontend/pom.xml
+++ b/frontend/pom.xml
@@ -5,7 +5,7 @@
gameyfin
de.grimsi
- 1.2.1
+ 1.2.2-SNAPSHOT
4.0.0
diff --git a/pom.xml b/pom.xml
index b100e7d..5c05bff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
de.grimsi
gameyfin
- 1.2.1
+ 1.2.2-SNAPSHOT
gameyfin
gameyfin