diff --git a/pom.xml b/pom.xml
index 82f52c4..64faf69 100644
--- a/pom.xml
+++ b/pom.xml
@@ -42,6 +42,13 @@
runtime
+
+
+ commons-io
+ commons-io
+ 2.11.0
+
+
org.springframework.boot
diff --git a/src/main/java/de/grimsi/gameyfin/igdb/IgdbWrapper.java b/src/main/java/de/grimsi/gameyfin/igdb/IgdbWrapper.java
index 300ae8a..939d488 100644
--- a/src/main/java/de/grimsi/gameyfin/igdb/IgdbWrapper.java
+++ b/src/main/java/de/grimsi/gameyfin/igdb/IgdbWrapper.java
@@ -5,9 +5,11 @@ import de.grimsi.gameyfin.igdb.dto.IgdbGame;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
+import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.util.UriComponentsBuilder;
+import reactor.netty.http.client.HttpClient;
import javax.annotation.PostConstruct;
import java.net.URI;
@@ -28,7 +30,9 @@ public class IgdbWrapper {
@Value("${gameyfin.igdb.config.preferred-platform}")
private int preferredPlatform;
- private final WebClient twitchApiClient = WebClient.create();
+ private final WebClient twitchApiClient = WebClient.builder()
+ .clientConnector(new ReactorClientHttpConnector(HttpClient.create().proxyWithSystemProperties()))
+ .build();
private WebClient igdbApiClient;
@@ -80,6 +84,7 @@ public class IgdbWrapper {
}
igdbApiClient = WebClient.builder()
+ .clientConnector(new ReactorClientHttpConnector(HttpClient.create().proxyWithSystemProperties()))
.baseUrl("https://api.igdb.com/v4/")
.defaultHeader("Client-ID", clientId)
.defaultHeader("Authorization", "Bearer %s".formatted(accessToken.getAccessToken()))
diff --git a/src/main/java/de/grimsi/gameyfin/rest/GameyfinDevController.java b/src/main/java/de/grimsi/gameyfin/rest/GameyfinDevController.java
index 004cece..d4cc758 100644
--- a/src/main/java/de/grimsi/gameyfin/rest/GameyfinDevController.java
+++ b/src/main/java/de/grimsi/gameyfin/rest/GameyfinDevController.java
@@ -3,6 +3,8 @@ package de.grimsi.gameyfin.rest;
import de.grimsi.gameyfin.dto.GameDto;
import de.grimsi.gameyfin.igdb.IgdbWrapper;
import de.grimsi.gameyfin.igdb.dto.IgdbGame;
+import de.grimsi.gameyfin.service.FilesystemService;
+import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
@@ -11,11 +13,18 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Collectors;
+
@RestController
public class GameyfinDevController {
@Autowired
- IgdbWrapper igdbWrapper;
+ private IgdbWrapper igdbWrapper;
+
+ @Autowired
+ private FilesystemService filesystemService;
@GetMapping(value = "/dev/findGameByTitle/{title}", produces = MediaType.APPLICATION_JSON_VALUE)
public GameDto findGameByTitle(@PathVariable("title") String title) {
@@ -29,4 +38,17 @@ public class GameyfinDevController {
return GameDto.builder().name(game.getName()).releaseDate(game.getFirstReleaseDate()).build();
}
+
+ @GetMapping(value = "/dev/gameFiles", produces = MediaType.APPLICATION_JSON_VALUE)
+ public List getAllGameFiles() {
+ return filesystemService.getGameFiles().stream().map(Path::toString).toList();
+ }
+
+ @GetMapping(value = "/dev/games", produces = MediaType.APPLICATION_JSON_VALUE)
+ public List getAllGames() {
+ return filesystemService.getGameFileNames().stream()
+ .map(t -> igdbWrapper.findGameByTitle(t))
+ .map(g -> GameDto.builder().name(g.getName()).releaseDate(g.getFirstReleaseDate()).build())
+ .toList();
+ }
}
diff --git a/src/main/java/de/grimsi/gameyfin/service/FilesystemService.java b/src/main/java/de/grimsi/gameyfin/service/FilesystemService.java
index 870efb1..18b9b51 100644
--- a/src/main/java/de/grimsi/gameyfin/service/FilesystemService.java
+++ b/src/main/java/de/grimsi/gameyfin/service/FilesystemService.java
@@ -1,10 +1,36 @@
package de.grimsi.gameyfin.service;
+import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
@Service
public class FilesystemService {
@Value("${gameyfin.root}")
private String rootFolderPath;
+
+ @Value("${gameyfin.file-extensions}")
+ private List possibleGameFileExtensions;
+
+ public List getGameFiles() {
+ Path rootFolder = Path.of(rootFolderPath);
+
+ try(Stream stream = Files.list(rootFolder)) {
+ // return all sub-folders (non-recursive) and files that have an extension that indicates that they are a downloadable file
+ return stream.filter(p -> Files.isDirectory(p) || possibleGameFileExtensions.contains(FilenameUtils.getExtension(p.getFileName().toString()))).toList();
+ } catch (IOException e) {
+ throw new RuntimeException("Error while opening root folder", e);
+ }
+ }
+
+ public List getGameFileNames() {
+ return this.getGameFiles().stream().map(p -> FilenameUtils.getBaseName(p.toString())).toList();
+ }
}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 6ea1869..f0f8dcf 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -1,5 +1,5 @@
gameyfin:
- root: D:\Games
+ root: C:\Projects\privat\gameyfin-library
igdb:
api:
client-id: 23l3l5qshx4dwjuao6yb8jyf1qrd08
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 5f8bd97..49e3afc 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -3,6 +3,7 @@ spring.jackson.default-property-inclusion: non_null
gameyfin:
root: ""
+ file-extensions: iso, zip, rar, 7z, exe
igdb:
config:
preferred-platform: 6