[LIB-13] Method scanUrl implementation for several scanners
[chesshog-scanner.git] / src / main / java / org / hedgecode / chess / scanner / portal / LiChessScanner.java
index 134180e..18497a1 100644 (file)
 package org.hedgecode.chess.scanner.portal;
 
 import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+
+import org.apache.commons.text.StringEscapeUtils;
 
 import org.hedgecode.chess.scanner.ChessHogScannerException;
 import org.hedgecode.chess.scanner.entity.PGNGame;
 import org.hedgecode.chess.scanner.entity.PGNTournament;
+import org.hedgecode.chess.scanner.format.lichess.Format;
+import org.hedgecode.chess.scanner.format.lichess.GameFormat;
+
+import static org.hedgecode.chess.scanner.ChessHogScannerConstants.*;
 
 /**
  * LiChessScanner
@@ -33,10 +37,6 @@ public class LiChessScanner extends AbstractSettingsScanner {
 
     private static final String SETTINGS_FILENAME = "lichess.settings";
 
-    private static final String TOURNAMENT_GAMES_SPLIT_REGEX = "\\[Event \"[^\"]+\"\\]";
-    private static final String TOURNAMENT_NAME_REGEX = "\\[Event \"([^\"]+)\"\\]";
-    private static final String GAME_ID_REGEX = "\\[Site \"https://lichess.org/([^\"]+)\"\\]";
-
     @Override
     protected String getResourceName() {
         return SETTINGS_FILENAME;
@@ -61,6 +61,11 @@ public class LiChessScanner extends AbstractSettingsScanner {
         String pgn = request(
                 assignUrl(gameId)
         );
+        if (!isPgnFormat(pgn)) {
+            throw new ChessHogScannerException(
+                    String.format("Failed to get PGN for requesting game ID: %s", gameId)
+            );
+        }
         return new PGNGame(
                 gameId, pgn
         );
@@ -73,7 +78,38 @@ public class LiChessScanner extends AbstractSettingsScanner {
 
     @Override
     public PGNGame scanUrl(String gameUrl) throws ChessHogScannerException {
-        return null;
+        String gamePage = request(gameUrl);
+        String pgn = regex(
+                gamePage,
+                getSettings().getGameUrlRegex()
+        );
+        if (pgn == null) {
+            pgn = regex(
+                    gamePage,
+                    getSettings().getGameJsonUrlRegex()
+            );
+            if (pgn == null) {
+                throw new ChessHogScannerException(
+                        String.format("Failed to get source data for requesting URL: %s", gameUrl)
+                );
+            }
+            GameFormat gameFormat = Format.formatGame(pgn);
+            return new PGNGame(
+                    gameFormat.id(),
+                    gameFormat.pgn()
+            );
+        } else {
+            pgn = StringEscapeUtils.unescapeHtml4(pgn);
+            if (!isPgnFormat(pgn)) {
+                throw new ChessHogScannerException(
+                        String.format("Failed to get PGN for requesting URL: %s", gameUrl)
+                );
+            }
+            return new PGNGame(
+                    regex(pgn, getSettings().getGameIdRegex()),
+                    pgn
+            );
+        }
     }
 
     private void assignTournamentGames(PGNTournament tournament) throws ChessHogScannerException {
@@ -83,30 +119,27 @@ public class LiChessScanner extends AbstractSettingsScanner {
                         tournament.id(),
                         null
                 ),
-                TOURNAMENT_GAMES_SPLIT_REGEX
+                PGN_DETECT_REGEX
         );
 
         if (!pgnGames.isEmpty()) {
             tournament.setName(
-                    find(TOURNAMENT_NAME_REGEX, pgnGames.get(0))
+                    regex(
+                            pgnGames.get(0),
+                            getSettings().getTournamentNameRegex()
+                    )
             );
         }
 
         for (String pgn : pgnGames) {
-            String gameId = find(GAME_ID_REGEX, pgn);
+            String gameId = regex(
+                    pgn,
+                    getSettings().getGameIdRegex()
+            );
             tournament.addGame(
                     new PGNGame(gameId, pgn)
             );
         }
     }
 
-    private String find(String regex, String pgn) {
-        Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
-        Matcher matcher = pattern.matcher(pgn);
-        if (matcher.find()) {
-            return matcher.group(1);
-        }
-        return null;
-    }
-
 }