diff --git a/juniores_jorneys.json b/juniores_jorneys.json new file mode 100644 index 0000000..39361ce --- /dev/null +++ b/juniores_jorneys.json @@ -0,0 +1 @@ +{"14":[{"season":"2025/2026","jorneyID":2317,"numberJorney":"14","Home":22,"Away":19,"homeGoals":"11","awayGoals":"1","cup":0,"date":"2026-04-17T20:00:00.000Z","field":"Touguinha","reportURL":"/uploads/reports/33/3/2317.pdf","typeModality":"Junior"},{"season":"2025/2026","jorneyID":2319,"numberJorney":"14","Home":13,"Away":11,"homeGoals":"2","awayGoals":"8","cup":0,"date":"2026-04-19T09:00:00.000Z","field":"Arcos","reportURL":"/uploads/reports/33/3/2319.pdf","typeModality":"Junior"},{"season":"2025/2026","jorneyID":2321,"numberJorney":"14","Home":6,"Away":-1,"homeGoals":"","awayGoals":"","cup":0,"date":"1970-01-01T00:00:00.000Z","field":"Aveleda F.C.","reportURL":null,"typeModality":"Junior"},{"season":"2025/2026","jorneyID":2318,"numberJorney":"14","Home":2,"Away":12,"homeGoals":"11","awayGoals":"0","cup":0,"date":"2026-04-17T20:00:00.000Z","field":"Bagunte","reportURL":null,"typeModality":"Junior"},{"season":"2025/2026","jorneyID":2320,"numberJorney":"14","Home":23,"Away":25,"homeGoals":"7","awayGoals":"3","cup":0,"date":"2026-04-17T20:00:00.000Z","field":"Rio Mau","reportURL":"/uploads/reports/33/3/2320.pdf","typeModality":"Junior"}]} \ No newline at end of file diff --git a/src/main/java/org/example/ApiDiscoveryCombinations.java b/src/main/java/org/example/ApiDiscoveryCombinations.java new file mode 100644 index 0000000..6a272a4 --- /dev/null +++ b/src/main/java/org/example/ApiDiscoveryCombinations.java @@ -0,0 +1,38 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class ApiDiscoveryCombinations { + public static void main(String[] args) { + String[] paths = { + "https://api.afavcd.pt/jorney/season/33/modality/1/discipline/teams", + "https://api.afavcd.pt/jorney/modality/1/season/33/discipline/teams", + "https://api.afavcd.pt/jorney/season/33/modality/1/discipline/1", + "https://api.afavcd.pt/jorney/season/33/modality/1/discipline/1/1", + "https://api.afavcd.pt/seasons/33/modality/1/discipline/1/jorney/1", + "https://api.afavcd.pt/seasons/33/modality/1/discipline/teams/jorney/1", + "https://api.afavcd.pt/standings/season/33/modality/1/discipline/1", + "https://api.afavcd.pt/standings/season/33/modality/1/discipline/teams" + }; + + for (String url : paths) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200 && response.body().length() > 0) { + System.out.println("Result: " + response.body().substring(0, Math.min(response.body().length(), 200))); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/ApiExplorer.java b/src/main/java/org/example/ApiExplorer.java new file mode 100644 index 0000000..5215337 --- /dev/null +++ b/src/main/java/org/example/ApiExplorer.java @@ -0,0 +1,31 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class ApiExplorer { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/modalities", + "https://api.afavcd.pt/seasons/33/modalities", + "https://api.afavcd.pt/seasons/33/modality/1/levels" + }; + + for (String url : urls) { + System.out.println("Exploring: " + url); + try { + String body = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute() + .body(); + System.out.println("Result: " + body); + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/BruteForceJorneyIds.java b/src/main/java/org/example/BruteForceJorneyIds.java new file mode 100644 index 0000000..f42ee1d --- /dev/null +++ b/src/main/java/org/example/BruteForceJorneyIds.java @@ -0,0 +1,34 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class BruteForceJorneyIds { + public static void main(String[] args) { + // We know 2166 is Journey 31 for Senior (Modality 1) + // Let's test a range of IDs + for (int id = 2130; id <= 2170; id++) { + String url = "https://api.afavcd.pt/seasons/33/teams/modality/1/jorney?jorneyID=" + id; + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .timeout(2000) + .execute(); + if (response.statusCode() == 200) { + String body = response.body(); + // Check if the body contains the ID we asked for + if (body.contains(String.valueOf(id))) { + System.out.println("ID " + id + " is valid and returned data."); + } else { + // System.out.println("ID " + id + " returned journey 31 data instead."); + } + } + } catch (Exception e) { + // System.out.println("ID " + id + " failed."); + } + } + } +} diff --git a/src/main/java/org/example/ChampionshipExplorer.java b/src/main/java/org/example/ChampionshipExplorer.java new file mode 100644 index 0000000..2b6d9b4 --- /dev/null +++ b/src/main/java/org/example/ChampionshipExplorer.java @@ -0,0 +1,34 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class ChampionshipExplorer { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/championships", + "https://api.afavcd.pt/seasons/33/championships", + "https://api.afavcd.pt/championship/1/standings", + "https://api.afavcd.pt/championship/1/jorney" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200) { + System.out.println("Result: " + response.body()); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/ChampionshipJorneysTest.java b/src/main/java/org/example/ChampionshipJorneysTest.java new file mode 100644 index 0000000..9235924 --- /dev/null +++ b/src/main/java/org/example/ChampionshipJorneysTest.java @@ -0,0 +1,34 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class ChampionshipJorneysTest { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/championship/1/jorneys", + "https://api.afavcd.pt/championship/1/jorneys/1", + "https://api.afavcd.pt/championship/3/jorneys", + "https://api.afavcd.pt/championship/1/standings" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200) { + System.out.println("Result: " + response.body()); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/CheckSeasons.java b/src/main/java/org/example/CheckSeasons.java new file mode 100644 index 0000000..909f504 --- /dev/null +++ b/src/main/java/org/example/CheckSeasons.java @@ -0,0 +1,23 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class CheckSeasons { + public static void main(String[] args) { + String url = "https://api.afavcd.pt/seasons"; + try { + String body = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute() + .body(); + System.out.println("Seasons JSON: " + body); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/org/example/DisciplineJorneyDiscovery.java b/src/main/java/org/example/DisciplineJorneyDiscovery.java new file mode 100644 index 0000000..393b203 --- /dev/null +++ b/src/main/java/org/example/DisciplineJorneyDiscovery.java @@ -0,0 +1,34 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class DisciplineJorneyDiscovery { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/jorney/season/33/modality/1/discipline/1", + "https://api.afavcd.pt/jorney/season/33/modality/3/discipline/1", + "https://api.afavcd.pt/standings/season/33/modality/1/discipline/1", + "https://api.afavcd.pt/standings/season/33/modality/3/discipline/1" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200 && response.body().length() > 0) { + System.out.println("Result: " + response.body().substring(0, Math.min(response.body().length(), 200))); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/DisciplineSearch.java b/src/main/java/org/example/DisciplineSearch.java new file mode 100644 index 0000000..2ea001a --- /dev/null +++ b/src/main/java/org/example/DisciplineSearch.java @@ -0,0 +1,33 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class DisciplineSearch { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/disciplines", + "https://api.afavcd.pt/seasons/33/disciplines", + "https://api.afavcd.pt/seasons/33/modality/1/disciplines" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200 && response.body().length() > 0) { + System.out.println("Result: " + response.body()); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/ExhaustiveApiSearch.java b/src/main/java/org/example/ExhaustiveApiSearch.java new file mode 100644 index 0000000..970d86d --- /dev/null +++ b/src/main/java/org/example/ExhaustiveApiSearch.java @@ -0,0 +1,43 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class ExhaustiveApiSearch { + public static void main(String[] args) { + String base = "https://api.afavcd.pt/seasons/33"; + String[] paths = { + "/modality/1/standings", + "/modality/1/discipline/1/standings", + "/modality/1/level/1/discipline/1/standings", + "/teams/modality/1/standings", + "/teams/modality/1/discipline/1/standings", + "/teams/modality/1/jorney?jorney=1", + "/teams/modality/1/jorney?number=1", + "/teams/modality/1/jorney?id=1", + "/teams/modality/1/jorney/all", + "/teams/modality/1/games", + "/teams/modality/1/all-games" + }; + + for (String path : paths) { + String url = base + path; + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200 && response.body().length() > 2) { + System.out.println("Preview: " + response.body().substring(0, Math.min(response.body().length(), 200))); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/FinalApiDiscovery.java b/src/main/java/org/example/FinalApiDiscovery.java new file mode 100644 index 0000000..3da2ca0 --- /dev/null +++ b/src/main/java/org/example/FinalApiDiscovery.java @@ -0,0 +1,34 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class FinalApiDiscovery { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/jorney/modality/1/season/33", + "https://api.afavcd.pt/jorney/active/modality/1/season/33", + "https://api.afavcd.pt/seasons/33/modality/1/jorney", + "https://api.afavcd.pt/seasons/33/modality/1/discipline/1/jorney" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200 && response.body().length() > 0) { + System.out.println("Preview: " + response.body().substring(0, Math.min(response.body().length(), 500))); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/FindChampionships.java b/src/main/java/org/example/FindChampionships.java new file mode 100644 index 0000000..56b12e6 --- /dev/null +++ b/src/main/java/org/example/FindChampionships.java @@ -0,0 +1,33 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class FindChampionships { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/campeonatos", + "https://api.afavcd.pt/teams/modality/1/season/33/discipline/teams", + "https://api.afavcd.pt/seasons/33/modality/1/discipline/1/jorney" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200 && response.body().length() > 0) { + System.out.println("Preview: " + response.body().substring(0, Math.min(response.body().length(), 500))); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/FindLatestSeason.java b/src/main/java/org/example/FindLatestSeason.java new file mode 100644 index 0000000..eb6d209 --- /dev/null +++ b/src/main/java/org/example/FindLatestSeason.java @@ -0,0 +1,34 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class FindLatestSeason { + public static void main(String[] args) { + for (int i = 30; i < 40; i++) { + String url = "https://api.afavcd.pt/seasons/" + i + "/teams/modality/1/discipline/teams"; + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + + if (response.statusCode() == 200) { + String body = response.body(); + if (body.length() > 20) { // Some results found + System.out.println("Season " + i + " exists. Length: " + body.length()); + } else { + System.out.println("Season " + i + " returns empty array."); + } + } else { + System.out.println("Season " + i + " returned status: " + response.statusCode()); + } + } catch (Exception e) { + System.out.println("Season " + i + " failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/InspectJornadas.java b/src/main/java/org/example/InspectJornadas.java new file mode 100644 index 0000000..bf782af --- /dev/null +++ b/src/main/java/org/example/InspectJornadas.java @@ -0,0 +1,31 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class InspectJornadas { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/seasons/33/teams/modality/1/jorney", + "https://api.afavcd.pt/seasons/33/teams/modality/3/jorney" + }; + + for (String url : urls) { + System.out.println("Inspecting: " + url); + try { + String body = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute() + .body(); + System.out.println("Result length: " + body.length()); + System.out.println("Start of result: " + body.substring(0, Math.min(body.length(), 500))); + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/JorneyIdParamTest.java b/src/main/java/org/example/JorneyIdParamTest.java new file mode 100644 index 0000000..adf4380 --- /dev/null +++ b/src/main/java/org/example/JorneyIdParamTest.java @@ -0,0 +1,36 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class JorneyIdParamTest { + public static void main(String[] args) { + String base = "https://api.afavcd.pt/seasons/33/teams/modality/1/jorney"; + String[] urls = { + base + "?jorneyID=2166", + base + "?jorneyID=2165", + base + "?jorneyID=2164", + base + "?jorney=30", + base + "?jorney=1" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200) { + System.out.println("Preview: " + response.body().substring(0, Math.min(response.body().length(), 200))); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/JorneyListDiscovery.java b/src/main/java/org/example/JorneyListDiscovery.java new file mode 100644 index 0000000..ca4e755 --- /dev/null +++ b/src/main/java/org/example/JorneyListDiscovery.java @@ -0,0 +1,34 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class JorneyListDiscovery { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/jorneys/season/33/modality/1/discipline/1", + "https://api.afavcd.pt/jorneys/active/modality/1/season/33", + "https://api.afavcd.pt/seasons/33/modality/1/discipline/1/jorney", + "https://api.afavcd.pt/jorney/active/modality/1/discipline/1/season/33" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200 && response.body().length() > 0) { + System.out.println("Result: " + response.body()); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index 951dd2c..ac73aa9 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -92,9 +92,9 @@ public class Main { return; } - // 2. Obter escalões - int[] idsEscaloes = { 1, 3, 2 }; - String[] nomesEscaloes = { "seniores", "juniores", "feminino" }; + // 2. Obter escalões (Apenas Seniores e Juniores conforme pedido) + int[] idsEscaloes = { 1, 3 }; + String[] nomesEscaloes = { "seniores", "juniores" }; for (int i = 0; i < idsEscaloes.length; i++) { int idAtual = idsEscaloes[i]; @@ -166,10 +166,12 @@ public class Main { foto = (String) atleta.get("photoURl"); } - if (foto != null && !foto.startsWith("http")) { - foto = "https://api.afavcd.pt" + foto; + if (foto != null && !foto.trim().isEmpty() && !foto.equalsIgnoreCase("null")) { + if (!foto.startsWith("http")) { + foto = "https://api.afavcd.pt" + foto; + } + p.setPhotoUrl(foto); } - p.setPhotoUrl(foto); if (atleta.get("birth") != null) { String date = (String) atleta.get("birth"); @@ -190,7 +192,7 @@ public class Main { } catch (Exception e) { System.err.println("Erro ao processar jogadores do clube ID: " + clubId); - e.printStackTrace(); + // e.printStackTrace(); } } diff --git a/src/main/java/org/example/SeasonDetailTest.java b/src/main/java/org/example/SeasonDetailTest.java new file mode 100644 index 0000000..d7cbaab --- /dev/null +++ b/src/main/java/org/example/SeasonDetailTest.java @@ -0,0 +1,26 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class SeasonDetailTest { + public static void main(String[] args) { + String url = "https://api.afavcd.pt/seasons/33"; + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200) { + System.out.println("Result: " + response.body()); + } + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + } + } +} diff --git a/src/main/java/org/example/SeasonGamesTest.java b/src/main/java/org/example/SeasonGamesTest.java new file mode 100644 index 0000000..0b53fe3 --- /dev/null +++ b/src/main/java/org/example/SeasonGamesTest.java @@ -0,0 +1,34 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class SeasonGamesTest { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/games/season/33/modality/1", + "https://api.afavcd.pt/games/modality/1/season/33", + "https://api.afavcd.pt/seasons/33/modality/1/games", + "https://api.afavcd.pt/jorneys/season/33/modality/1" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200) { + System.out.println("Preview: " + response.body().substring(0, Math.min(response.body().length(), 200))); + } + } catch (Exception e) { + // System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/StandingsScraper.java b/src/main/java/org/example/StandingsScraper.java index fc0b99c..6c824f1 100644 --- a/src/main/java/org/example/StandingsScraper.java +++ b/src/main/java/org/example/StandingsScraper.java @@ -8,6 +8,7 @@ import com.google.firebase.database.FirebaseDatabase; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.example.models.Club; +import org.example.models.GameMatch; import org.example.models.TeamStanding; import org.jsoup.Connection; import org.jsoup.Jsoup; @@ -99,22 +100,56 @@ public class StandingsScraper { .execute() .body(); - Map>> matchdays = gson.fromJson(jsonJornadas, + Map>> matchdaysMap = gson.fromJson(jsonJornadas, new TypeToken>>>() { }.getType()); Map standingsMap = new HashMap<>(); + Map> jornadasParaFirebase = new LinkedHashMap<>(); + + for (Map.Entry>> entry : matchdaysMap.entrySet()) { + String nomeJornada = entry.getKey(); + List> matchday = entry.getValue(); + List matchesInJornada = new ArrayList<>(); - for (List> matchday : matchdays.values()) { for (Map match : matchday) { try { int homeTeamId = parseId(match.get("Home")); int awayTeamId = parseId(match.get("Away")); - // Ignorar jogos com equipas placeholder / de descanso + // Ignorar jogos com equipas placeholder / de descanso para a classificação + // Mas guardamos para as jornadas (podes decidir se queres filtrar ou não) if (homeTeamId < 0 || awayTeamId < 0) continue; + // Modelar o jogo para as Jornadas + GameMatch game = new GameMatch(); + game.setHomeId(homeTeamId); + game.setAwayId(awayTeamId); + // Buscar dados dos clubes no mapa local para garantir nome e logo + Club homeClub = clubesMap.get(homeTeamId); + Club awayClub = clubesMap.get(awayTeamId); + + game.setHomeName(homeClub != null ? homeClub.getName() : "Equipa " + homeTeamId); + game.setAwayName(awayClub != null ? awayClub.getName() : "Equipa " + awayTeamId); + game.setHomeLogo(homeClub != null ? homeClub.getImageUrl() : ""); + game.setAwayLogo(awayClub != null ? awayClub.getImageUrl() : ""); + + // Tratar Data e Hora (Vem como ISO: 2025-09-20T20:00:00.000Z) + String rawDate = match.get("date") != null ? match.get("date").toString() : ""; + if (!rawDate.isEmpty() && rawDate.contains("T")) { + String[] parts = rawDate.split("T"); + game.setGameDate(parts[0]); // yyyy-MM-dd + if (parts[1].length() >= 5) { + game.setGameHour(parts[1].substring(0, 5)); // HH:mm + } + } else { + game.setGameDate(rawDate); + game.setGameHour(""); + } + + game.setStadium(match.get("field") != null ? match.get("field").toString() : ""); + String homeGoalsStr = String.valueOf(match.get("homeGoals")); String awayGoalsStr = String.valueOf(match.get("awayGoals")); @@ -122,21 +157,31 @@ public class StandingsScraper { && !homeGoalsStr.equals("null")) { int homeGoals = (int) Double.parseDouble(homeGoalsStr); int awayGoals = (int) Double.parseDouble(awayGoalsStr); + + game.setHomeGoals(homeGoals); + game.setAwayGoals(awayGoals); - // Inicializar as equipas caso não existam no standingsMap + // Atualizar classificação standingsMap.putIfAbsent(homeTeamId, createInitialStanding(homeTeamId, clubesMap)); standingsMap.putIfAbsent(awayTeamId, createInitialStanding(awayTeamId, clubesMap)); standingsMap.get(homeTeamId).addMatchResult(homeGoals, awayGoals); standingsMap.get(awayTeamId).addMatchResult(awayGoals, homeGoals); + } else { + game.setHomeGoals(null); + game.setAwayGoals(null); } + + matchesInJornada.add(game); + } catch (Exception ex) { // Ignorar erro em um jogo específico (dados incorretos, etc) } } + jornadasParaFirebase.put(nomeJornada, matchesInJornada); } - // Transformar em lista e ordenar + // Transformar em lista e ordenar a classificação List sortedStandings = new ArrayList<>(standingsMap.values()); Collections.sort(sortedStandings); @@ -150,19 +195,27 @@ public class StandingsScraper { posicao++; } - // Enviar para Firebase + // Enviar para Firebase - CLASSIFICAÇÕES DatabaseReference refClassificacoes = FirebaseDatabase.getInstance() .getReference("classificacoes").child(escalao); refClassificacoes.setValueAsync(sortedStandings); System.out.println("-> Classificação de " + escalao + " enviada para o Firebase."); + // Enviar para Firebase - JORNADAS + DatabaseReference refJornadas = FirebaseDatabase.getInstance() + .getReference("jornadas").child(escalao); + + refJornadas.setValueAsync(jornadasParaFirebase); + System.out.println("-> Jornadas de " + escalao + " enviadas para o Firebase (" + jornadasParaFirebase.size() + " jornadas)."); + } catch (Exception e) { System.err.println("Erro a processar " + escalao); e.printStackTrace(); } } + try { System.out.println("\nAguardando confirmação do servidor (5s)..."); Thread.sleep(5000); diff --git a/src/main/java/org/example/TestApiSingular.java b/src/main/java/org/example/TestApiSingular.java new file mode 100644 index 0000000..dee8ae0 --- /dev/null +++ b/src/main/java/org/example/TestApiSingular.java @@ -0,0 +1,23 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class TestApiSingular { + public static void main(String[] args) { + String url = "https://api.afavcd.pt/seasons/33/teams/modality/3/jorney"; + try { + String body = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute() + .body(); + System.out.println(body.substring(0, Math.min(body.length(), 2000))); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/org/example/TestAthleteHeaders.java b/src/main/java/org/example/TestAthleteHeaders.java new file mode 100644 index 0000000..12bd428 --- /dev/null +++ b/src/main/java/org/example/TestAthleteHeaders.java @@ -0,0 +1,28 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class TestAthleteHeaders { + public static void main(String[] args) { + // Try club 1, modality 1, season 33 + String url = "https://api.afavcd.pt/teams/1/modality/1/season/33"; + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode()); + if (response.statusCode() == 200) { + System.out.println("Result: " + response.body().substring(0, Math.min(response.body().length(), 500))); + } + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/src/main/java/org/example/TestAthleteJson.java b/src/main/java/org/example/TestAthleteJson.java new file mode 100644 index 0000000..460df46 --- /dev/null +++ b/src/main/java/org/example/TestAthleteJson.java @@ -0,0 +1,26 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class TestAthleteJson { + public static void main(String[] args) { + // Club ID 1 (Arvore) and Modality 1 (Senior) + String url = "https://api.afavcd.pt/teams/1/modality/1/season/33"; + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + if (response.statusCode() == 200) { + System.out.println("Result: " + response.body().substring(0, Math.min(response.body().length(), 2000))); + } + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + } + } +} diff --git a/src/main/java/org/example/TestClubGames.java b/src/main/java/org/example/TestClubGames.java new file mode 100644 index 0000000..3388bd5 --- /dev/null +++ b/src/main/java/org/example/TestClubGames.java @@ -0,0 +1,33 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class TestClubGames { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/teams/16/modality/1/season/33/games", + "https://api.afavcd.pt/teams/16/modality/1/season/33/jorney", + "https://api.afavcd.pt/games/modality/1/season/33" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200 && response.body().length() > 0) { + System.out.println("Preview: " + response.body().substring(0, Math.min(response.body().length(), 200))); + } + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/TestJornadaEndpoint.java b/src/main/java/org/example/TestJornadaEndpoint.java new file mode 100644 index 0000000..6019c64 --- /dev/null +++ b/src/main/java/org/example/TestJornadaEndpoint.java @@ -0,0 +1,34 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class TestJornadaEndpoint { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/seasons/33/teams/modality/1/jorney/1", + "https://api.afavcd.pt/seasons/33/teams/modality/1/jorney/2", + "https://api.afavcd.pt/seasons/33/teams/modality/1/jornadas", + "https://api.afavcd.pt/seasons/33/teams/modality/1/games" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200 && response.body().length() > 0) { + System.out.println("Preview: " + response.body().substring(0, Math.min(response.body().length(), 200))); + } + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/TestJorneyId.java b/src/main/java/org/example/TestJorneyId.java new file mode 100644 index 0000000..f1e8698 --- /dev/null +++ b/src/main/java/org/example/TestJorneyId.java @@ -0,0 +1,35 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class TestJorneyId { + public static void main(String[] args) { + // Try to fetch a specific journey by its ID + String[] urls = { + "https://api.afavcd.pt/jorney/2166", + "https://api.afavcd.pt/jorney/2165", + "https://api.afavcd.pt/jorney/2164", + "https://api.afavcd.pt/seasons/33/jorneys" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200) { + System.out.println("Preview: " + response.body().substring(0, Math.min(response.body().length(), 200))); + } + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/TestJorneysPlural.java b/src/main/java/org/example/TestJorneysPlural.java new file mode 100644 index 0000000..a0849e6 --- /dev/null +++ b/src/main/java/org/example/TestJorneysPlural.java @@ -0,0 +1,26 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class TestJorneysPlural { + public static void main(String[] args) { + String url = "https://api.afavcd.pt/seasons/33/teams/modality/1/jorneys"; + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200) { + System.out.println("Result: " + response.body().substring(0, Math.min(response.body().length(), 1000))); + } + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + } + } +} diff --git a/src/main/java/org/example/TestNewEndpoint.java b/src/main/java/org/example/TestNewEndpoint.java new file mode 100644 index 0000000..766d556 --- /dev/null +++ b/src/main/java/org/example/TestNewEndpoint.java @@ -0,0 +1,26 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class TestNewEndpoint { + public static void main(String[] args) { + String url = "https://api.afavcd.pt/seasons/33/teams/modality/1"; + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200) { + System.out.println("Result: " + response.body().substring(0, Math.min(response.body().length(), 500))); + } + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + } + } +} diff --git a/src/main/java/org/example/TestNewJornadaEndpoint.java b/src/main/java/org/example/TestNewJornadaEndpoint.java new file mode 100644 index 0000000..009d5f4 --- /dev/null +++ b/src/main/java/org/example/TestNewJornadaEndpoint.java @@ -0,0 +1,34 @@ +package org.example; + +import org.jsoup.Jsoup; +import org.jsoup.Connection; + +public class TestNewJornadaEndpoint { + public static void main(String[] args) { + String[] urls = { + "https://api.afavcd.pt/seasons/33/modality/1/jorney", + "https://api.afavcd.pt/seasons/33/modality/3/jorney", + "https://api.afavcd.pt/seasons/33/modality/1/discipline/1/jorney", + "https://api.afavcd.pt/seasons/33/modality/1/level/1/discipline/1/jorney" + }; + + for (String url : urls) { + System.out.println("Testing: " + url); + try { + Connection.Response response = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .header("Referer", "https://www.afavcd.pt/") + .header("Origin", "https://www.afavcd.pt") + .method(Connection.Method.GET) + .execute(); + System.out.println("Status: " + response.statusCode() + " Length: " + response.body().length()); + if (response.statusCode() == 200 && response.body().length() > 0) { + System.out.println("Preview: " + response.body().substring(0, Math.min(response.body().length(), 200))); + } + } catch (Exception e) { + System.out.println("Failed: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/org/example/models/GameMatch.java b/src/main/java/org/example/models/GameMatch.java new file mode 100644 index 0000000..89533af --- /dev/null +++ b/src/main/java/org/example/models/GameMatch.java @@ -0,0 +1,152 @@ +package org.example.models; + +import com.google.firebase.database.PropertyName; + +public class GameMatch { + + @PropertyName("home_id") + private int homeId; + + @PropertyName("away_id") + private int awayId; + + @PropertyName("home_nome") + private String homeName; + + @PropertyName("away_nome") + private String awayName; + + @PropertyName("home_logo") + private String homeLogo; + + @PropertyName("away_logo") + private String awayLogo; + + @PropertyName("home_golos") + private Integer homeGoals; + + @PropertyName("away_golos") + private Integer awayGoals; + + @PropertyName("data") + private String gameDate; + + @PropertyName("hora") + private String gameHour; + + @PropertyName("campo") + private String stadium; + + public GameMatch() { + } + + @PropertyName("home_id") + public int getHomeId() { + return homeId; + } + + @PropertyName("home_id") + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + @PropertyName("away_id") + public int getAwayId() { + return awayId; + } + + @PropertyName("away_id") + public void setAwayId(int awayId) { + this.awayId = awayId; + } + + @PropertyName("home_nome") + public String getHomeName() { + return homeName; + } + + @PropertyName("home_nome") + public void setHomeName(String homeName) { + this.homeName = homeName; + } + + @PropertyName("away_nome") + public String getAwayName() { + return awayName; + } + + @PropertyName("away_nome") + public void setAwayName(String awayName) { + this.awayName = awayName; + } + + @PropertyName("home_logo") + public String getHomeLogo() { + return homeLogo; + } + + @PropertyName("home_logo") + public void setHomeLogo(String homeLogo) { + this.homeLogo = homeLogo; + } + + @PropertyName("away_logo") + public String getAwayLogo() { + return awayLogo; + } + + @PropertyName("away_logo") + public void setAwayLogo(String awayLogo) { + this.awayLogo = awayLogo; + } + + @PropertyName("home_golos") + public Integer getHomeGoals() { + return homeGoals; + } + + @PropertyName("home_golos") + public void setHomeGoals(Integer homeGoals) { + this.homeGoals = homeGoals; + } + + @PropertyName("away_golos") + public Integer getAwayGoals() { + return awayGoals; + } + + @PropertyName("away_golos") + public void setAwayGoals(Integer awayGoals) { + this.awayGoals = awayGoals; + } + + @PropertyName("data") + public String getGameDate() { + return gameDate; + } + + @PropertyName("data") + public void setGameDate(String gameDate) { + this.gameDate = gameDate; + } + + @PropertyName("hora") + public String getGameHour() { + return gameHour; + } + + @PropertyName("hora") + public void setGameHour(String gameHour) { + this.gameHour = gameHour; + } + + @PropertyName("campo") + public String getStadium() { + return stadium; + } + + @PropertyName("campo") + public void setStadium(String stadium) { + this.stadium = stadium; + } +} diff --git a/teams.json b/teams.json new file mode 100644 index 0000000..be986ec --- /dev/null +++ b/teams.json @@ -0,0 +1 @@ +[{"teamID":1,"name":"G.D. Árvore","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Árvore.png","president":"António Araújo","dateFundation":"1975","address":" Edifício Junta de Freguesia. Rua do Loureiro S/N 4480-119 Árvore-Vila do Conde","field":"Campo Municipal de Retorta","equipmentUrlOld":"https://drive.google.com/uc?id=1Shjw-F6L304hofcoBgUlr0HsREA8HuYD&export=download","logoID":"1N4XCw_vgXqvxtBvLs4OAr9mEDC6EACj3","equipmentID":"1Shjw-F6L304hofcoBgUlr0HsREA8HuYD","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1Shjw-F6L304hofcoBgUlr0HsREA8HuYD","teamDocID":null},{"teamID":2,"name":"Bagunte F.C.","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Bagunte.png","president":"Cristiana Sá","dateFundation":"1960","address":"Rua Nossa Senhora de Fátima nº 1514, 4480-231 Bagunte","field":" Campo Desportivo de Bagunte","equipmentUrlOld":"https://drive.google.com/uc?id=1B17vd6dfzPnyVUAp6sImZEOfigz4PJ-o&export=download","logoID":"1Ajz3-YKoi2X5UGaqosL2ye7J0xHyQE6M","equipmentID":"1B17vd6dfzPnyVUAp6sImZEOfigz4PJ-o","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1B17vd6dfzPnyVUAp6sImZEOfigz4PJ-o","teamDocID":null},{"teamID":3,"name":"C.C.D. Macieira","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Macieira.png","president":" ","dateFundation":"1976","address":"Rua Nova nº 492, 4480.410 Macieira da Maia","field":"Parque dos Lagidos","equipmentUrlOld":"https://drive.google.com/uc?id=1hIgdQGG2BnAle7l2D63ybUiMEM1xR2lR&export=download","logoID":"1X0E-nREQY0jcyrqdFpoxtuu-t-JSTQy7","equipmentID":"1hIgdQGG2BnAle7l2D63ybUiMEM1xR2lR","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1hIgdQGG2BnAle7l2D63ybUiMEM1xR2lR","teamDocID":null},{"teamID":4,"name":"G.D. Tougues","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Tougues.png","president":"Joaquim Peniche","dateFundation":" 1976","address":" Rua do Monte nº 417 Tougues-Vila do Conde","field":"Campo Municipal de Retorta","equipmentUrlOld":"https://drive.google.com/uc?id=1_icSnUdPkwt_OJXSqfLlf4iUXEkHpNln&export=download","logoID":"1GOl2_XiSENGnW0gCXt_jNE61j3Hfe2Lk","equipmentID":"1_icSnUdPkwt_OJXSqfLlf4iUXEkHpNln","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1_icSnUdPkwt_OJXSqfLlf4iUXEkHpNln","teamDocID":null},{"teamID":5,"name":"A.D.C.R.S. Guilhabreu","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Guilhabreu.png","president":" Elisabete Duarte","dateFundation":"1964","address":" Rua Pintor Júlio Ramos nº10 Guilhabreu-Vila do Conde","field":"Campo Municipal de Guilhabreu","equipmentUrlOld":"https://drive.google.com/uc?id=1hnL3y-k8BLLzy2kkM-mjC4Tnp3Mw3bx6&export=download","logoID":"1-r_0zbGo08RVtrc9OAqWv24HAltyNCKl","equipmentID":"1hnL3y-k8BLLzy2kkM-mjC4Tnp3Mw3bx6","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1hnL3y-k8BLLzy2kkM-mjC4Tnp3Mw3bx6","teamDocID":null},{"teamID":6,"name":"Aveleda F.C.","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Aveleda.png","president":"Tiago Albuquerque","dateFundation":"1979","address":" Travessa de Aveleda nº 395 Avela-Vila do Conde","field":"Campo Municipal de Aveleda","equipmentUrlOld":"https://drive.google.com/uc?id=1ZzhEtNjy8jznSweYXc8XZP_MkwIokyJY&export=download","logoID":"13Bkto1BAM2zRx8cRKJSeNBuNQ1F-pGmw","equipmentID":"1ZzhEtNjy8jznSweYXc8XZP_MkwIokyJY","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1ZzhEtNjy8jznSweYXc8XZP_MkwIokyJY","teamDocID":"1eV9XAwSqUUGCizps9bD3kn0uld651khI"},{"teamID":7,"name":"F.C. Vila Chã","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Vet. Vila Chã.png","president":"César Silva","dateFundation":"2022","address":" Rua Nova da Fonte S/N Vila Chã-Vila do Conde","field":"Campo Desportivo de Vila Chã","equipmentUrlOld":"https://drive.google.com/uc?id=1RokeSLqht2kmSw5i39EMhrqlAGDlZaL3&export=download","logoID":"1uAAKgs-J9-Gmhm9jXZOhX_dlBA8xN3TX","equipmentID":"1RokeSLqht2kmSw5i39EMhrqlAGDlZaL3","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1RokeSLqht2kmSw5i39EMhrqlAGDlZaL3","teamDocID":null},{"teamID":8,"name":"A.D.C. Retorta","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Retorta.jpg","president":"Ricardo Almeida","dateFundation":" 1976","address":" Rua Fonte da Torre nº 107 Retorta-Vila do Conde","field":"Campo Municipal de Retorta","equipmentUrlOld":"https://drive.google.com/uc?id=1s1r-O0hW1H_TzrRNzGHtBpP5cXDDpejl&export=download","logoID":"15h7NLtcMZ-zmF-ZmaN9iThtygrHief9I","equipmentID":"1s1r-O0hW1H_TzrRNzGHtBpP5cXDDpejl","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1s1r-O0hW1H_TzrRNzGHtBpP5cXDDpejl","teamDocID":null},{"teamID":9,"name":"A.C.R.D. Vairão","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Vairão.png","president":"Leandro Amorim","dateFundation":" 1983","address":" Largo do Mosteiro nº 100 Vairão-Vila do Conde","field":"Parque Desportivo Engenheiro António Moreira","equipmentUrlOld":"https://drive.google.com/uc?id=16v3jcThRV2NJVj8990lf-s3pKbIyKG1h&export=download","logoID":"1rA1FUr1MHIyOcYiwaPWMK531GInOSFvT","equipmentID":"16v3jcThRV2NJVj8990lf-s3pKbIyKG1h","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/16v3jcThRV2NJVj8990lf-s3pKbIyKG1h","teamDocID":null},{"teamID":10,"name":"A.C.D. Fornelo","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Fornelo.jpg","president":"Agostinho Campos","dateFundation":"1985","address":" Rua dos Sobreiros nº104 Fornelo-Vila do Conde","field":"Campo Municipal de Fornelo","equipmentUrlOld":"https://drive.google.com/uc?id=1nPWWU35NwhMuQ4WhIxd3rja7BGcTfNft&export=download","logoID":"1GuKEdkf-Q3kMgg8pdO55b1ZqdHI9pwTB","equipmentID":"1nPWWU35NwhMuQ4WhIxd3rja7BGcTfNft","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1nPWWU35NwhMuQ4WhIxd3rja7BGcTfNft","teamDocID":null},{"teamID":11,"name":"A.C.D. Fajozes","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Fajozes.png","president":"André Filipe Pereira","dateFundation":"1986","address":" Rua das Póvoas Fajozes-Vila do Conde","field":"Campo Desportivo de Fajozes","equipmentUrlOld":"https://drive.google.com/uc?id=171_vKXJ5GGGBa8QhEPYAcm9rkG5nTezP&export=download","logoID":"1PJsXI5xUfNSulkWdE7sWLdvHEZS9ojjG","equipmentID":"171_vKXJ5GGGBa8QhEPYAcm9rkG5nTezP","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/171_vKXJ5GGGBa8QhEPYAcm9rkG5nTezP","teamDocID":null},{"teamID":12,"name":"C.D.C.R. Gião","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Gião.png","president":"José Arteiro","dateFundation":" 1976","address":" Rua da Igreja nº247 Gião-Vila do Conde","field":"Campo Municipal de Gião ","equipmentUrlOld":"https://drive.google.com/uc?id=10MJi8OSq6ArgesfqC1EixWBiWCmLlqCf&export=download","logoID":"1itzo0sfKdYbV-yljaMJqt0jGBoqEyz5X","equipmentID":"10MJi8OSq6ArgesfqC1EixWBiWCmLlqCf","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/10MJi8OSq6ArgesfqC1EixWBiWCmLlqCf","teamDocID":"10ZY51gS9Tv1d4MdiwkBIKpAxCCO0_YDh"},{"teamID":13,"name":"A.C.D. Arcos","logoURL":"https://lh3.googleusercontent.com/d/1GhmwfRj8fMXSNrJwPw-2obJZnyvIaHgr","president":" Eduardo Pereira","dateFundation":" 1986","address":" Rua da Ponte nº 29 Arcos-Vila do Conde","field":"Campo Engº Mário de Almeida","equipmentUrlOld":"https://drive.google.com/uc?id=1ALBpU-Na3r5sLd7c4YukyOfAXMUEjPlr&export=download","logoID":"1GhmwfRj8fMXSNrJwPw-2obJZnyvIaHgr","equipmentID":"1ALBpU-Na3r5sLd7c4YukyOfAXMUEjPlr","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1ALBpU-Na3r5sLd7c4YukyOfAXMUEjPlr","teamDocID":null},{"teamID":14,"name":"F.C. Malta","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Malta.png","president":" José dos Santos","dateFundation":" 1934","address":"Rua do Tapado, nº 171 4480-450 Malta","field":"Campo do Tapado","equipmentUrlOld":"https://drive.google.com/uc?id=1N9mOkx_Rh_0p8BrtrFj9_Zq7W9Z-i2u7&export=download","logoID":"1-nRJre_BxBwrwpzXoiGJ3bK_PM4TWVuB","equipmentID":"1N9mOkx_Rh_0p8BrtrFj9_Zq7W9Z-i2u7","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1N9mOkx_Rh_0p8BrtrFj9_Zq7W9Z-i2u7","teamDocID":null},{"teamID":15,"name":"A.D. Labruge","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Labruge.png","president":"Jorge Faria","dateFundation":" 1991","address":" Rua da Gândar nº 140 Labruge-Vila do Conde","field":"Campo Municipal de Labruge","equipmentUrlOld":"https://drive.google.com/uc?id=1O0GbPDXyl3FimeKa_t2hwok6LY8sY4Ge&export=download","logoID":"1nzQnMLymrQlb3oUIhbvoRsW1CjBuWi5W","equipmentID":"1O0GbPDXyl3FimeKa_t2hwok6LY8sY4Ge","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1O0GbPDXyl3FimeKa_t2hwok6LY8sY4Ge","teamDocID":null},{"teamID":16,"name":"G.D. Vilar","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Vilar.png","president":" ","dateFundation":"1956","address":" Rua do Campo nº1 Vilar-Vila do Conde","field":"Campo Municipal de Aveleda","equipmentUrlOld":"https://drive.google.com/uc?id=1NSm5TcLQ6BSZogQNfou8Gpxax5TyGY7S&export=download","logoID":"1LaSiOAWmBqJXi-uC6H15AcYRjdoYSuwZ","equipmentID":"1NSm5TcLQ6BSZogQNfou8Gpxax5TyGY7S","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1NSm5TcLQ6BSZogQNfou8Gpxax5TyGY7S","teamDocID":null},{"teamID":17,"name":"A.C.D. Mindelo","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Mindelo.png","president":"António Vieira","dateFundation":" ","address":"Largo Cubas nº41, 4480-479 Mindelo ","field":"Campo Municipal de Gião","equipmentUrlOld":"https://drive.google.com/uc?id=14h0IUj18chT58xMpSvCE2pYoyAIUSlER&export=download","logoID":"1Ohvctxj4bMbl_fgkU9eH9ew2cRIoXfSw","equipmentID":"14h0IUj18chT58xMpSvCE2pYoyAIUSlER","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/14h0IUj18chT58xMpSvCE2pYoyAIUSlER","teamDocID":null},{"teamID":18,"name":"U.D.C.R. Junqueira","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Junqueira.png","president":"Marco Araújo","dateFundation":" ","address":" ","field":" Campo Desportivo da Junqueira","equipmentUrlOld":"https://drive.google.com/uc?id=18UfvnMVP6FomfCS7RJtak_M0krXsoJtP&export=download","logoID":"1N3FyoMtq5YE_cN6aJxnuTN54hRepk20K","equipmentID":"18UfvnMVP6FomfCS7RJtak_M0krXsoJtP","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/18UfvnMVP6FomfCS7RJtak_M0krXsoJtP","teamDocID":null},{"teamID":19,"name":"J.U. Mosteiró","logoURL":"https://lh3.googleusercontent.com/d/1hpt-K0ayou29KM9MLOEkvD9aKG91VBKu","president":" ","dateFundation":" ","address":" ","field":"Campo Municipal de Guilhabreu","equipmentUrlOld":"https://drive.google.com/uc?id=1_z_9klHt6OCQnwuZxlNyrl7UHUMoSL14&export=download","logoID":"1hpt-K0ayou29KM9MLOEkvD9aKG91VBKu","equipmentID":"1_z_9klHt6OCQnwuZxlNyrl7UHUMoSL14","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1_z_9klHt6OCQnwuZxlNyrl7UHUMoSL14","teamDocID":null},{"teamID":20,"name":"C. J. Malta","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Malta.png","president":" ","dateFundation":" ","address":" ","field":" ","equipmentUrlOld":null,"logoID":"19hJQynhCtQ4AZ4ScHnyb5_w3_R6yw-4c","equipmentID":null,"afpClubCode":null,"equipmentURL":null,"teamDocID":null},{"teamID":22,"name":"A.D.C.R. Touguinha","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Touguinha.png","president":" Sérgio Silva","dateFundation":" 1977","address":"Largo Capela de Santa Cristina, 4480-493 Touguinha","field":"Campo Municipal de Touguinha","equipmentUrlOld":"https://drive.google.com/uc?id=1Q3J8gWXumFy5q0BhdoFP7iUZc8LHSrCN&export=download","logoID":"1xwruB6ZpLHyhZGhhfKyo9zOkblQGWr5G","equipmentID":"1Q3J8gWXumFy5q0BhdoFP7iUZc8LHSrCN","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1Q3J8gWXumFy5q0BhdoFP7iUZc8LHSrCN","teamDocID":null},{"teamID":23,"name":"G.D.C. Rio Mau","logoURL":"https://api.afavcd.pt/uploads/photos/logos/Rio Mau.png","president":"André Brás","dateFundation":"1980","address":"Rua Inocência Rocha nº6 , Rio Mau-Vila do Conde","field":"Campo Municipal de Rio Mau","equipmentUrlOld":"https://drive.google.com/uc?id=1aqIYgAZMpba0ud77XIntJIruR3cyLWtg&export=download","logoID":"19P3Zdxcl2z1xMJhdZsOefbkKKZVFFQ9d","equipmentID":"1aqIYgAZMpba0ud77XIntJIruR3cyLWtg","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1aqIYgAZMpba0ud77XIntJIruR3cyLWtg","teamDocID":"1xoa6dQMJNM4vrJ82p5UNMhGBLaHNF_sd"},{"teamID":24,"name":"S.C. Vilar do Pinheiro","logoURL":"https://lh3.googleusercontent.com/d/1gCGk8JsbOT_vO_ghicu-1X4oy5Lwq22-","president":"...","dateFundation":"1961","address":"Vilar do Pinheiro","field":"Vilar do Pinheiro","equipmentUrlOld":"https://drive.google.com/uc?id=1v01_fuykacVpsbc-2MyHZUKl38QfZV4Y&export=download","logoID":"1gCGk8JsbOT_vO_ghicu-1X4oy5Lwq22-","equipmentID":"1v01_fuykacVpsbc-2MyHZUKl38QfZV4Y","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1v01_fuykacVpsbc-2MyHZUKl38QfZV4Y","teamDocID":""},{"teamID":25,"name":"C.D.R. Outeiro","logoURL":"https://lh3.googleusercontent.com/d/1v_2j3tqzfURHbLWeUZi5kn4IEk7ZRt4D","president":".","dateFundation":".","address":".","field":".","equipmentUrlOld":"https://drive.google.com/uc?id=1FSd4fhHOsuGZRJ8okh3ap5mi51utyUy5&export=download","logoID":"1v_2j3tqzfURHbLWeUZi5kn4IEk7ZRt4D","equipmentID":"1FSd4fhHOsuGZRJ8okh3ap5mi51utyUy5","afpClubCode":null,"equipmentURL":"https://lh3.googleusercontent.com/d/1FSd4fhHOsuGZRJ8okh3ap5mi51utyUy5","teamDocID":""}] \ No newline at end of file