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
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;
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
);
@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 {
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;
- }
-
}