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