Skip to content

Repository files navigation

Courtboard

Windowsos Flutter alkalmazás kedvenc sportolók követésére. Egy sportolói profilt több, egymást kiegészítő adatforrásból épít fel: ha az egyik szolgáltató nem válaszol vagy nem ismeri az adott mezőt, a többi forrás eredménye ettől még megjelenhet.

Az alkalmazás saját Adatforrás-kézikönyve kereshető sportág, szolgáltatónév, megjelenő adat, kvóta és cache alapján. Minden kártyán látható:

  • mi jelenik meg belőle a Courtboardban;
  • mire képes a szolgáltatás, és ebből mit használunk most;
  • kell-e kulcs, hol állítható be és mekkora a Free keret;
  • mennyi ideig cache-elünk;
  • mi történik, ha a forrás hibázik.

Képernyőképek

Nyitólap

A Courtboard nyitólapja a követett sportolókkal és a közelgő eseményekkel

Játékosoldal

Juhász Dorka játékosoldala valódi WNBA meccsnaplóval és mérkőzésadatokkal

Felület és személyes beállítások

  • Az Áttekintés fogaskerék ikonja és a bal oldali Beállítások menüpont ugyanazt a beállítási oldalt nyitja meg.
  • A megjelenéshez választható a zöld és a bordó téma.
  • Az Áttekintés kártyái és a Sportolók listája egymástól függetlenül rendezhető saját sorrend, név, sportág vagy csapat szerint.
  • A Sportolók oldalon név szerinti keresés és sportág szerinti szűrés használható.
  • A Videók médiatár az összes sportolóhoz mentett YouTube-videót egy helyen mutatja; cím, sportoló és sportág szerint szűrhető.
  • A Hírek oldal RSS-forrásokból és a FOX aktuális NBA-, WNBA-, foci- és tenisz-oldalfeedjeiből épít tartós, cím, sportág, sportoló és forrás szerint kereshető helyi archívumot.
  • A választott téma és rendezések automatikusan a helyi állapotfájlba kerülnek.
  • A darts sportolóknál nincs csapatmező, ezért az üres vagy „Nincs megadva” csapat nem jelenik meg a kártyákon és profilokon.
  • A teniszprofiloknál ugyancsak nincs csapatmező. A Live Tennis API adja az aktuális ranglistát, a játékos alapadatait, az élő állást és a következő mérkőzéseket.

Gyors indítás Windows alatt

Már elkészített kiadás használata

Szükséges:

  • Windows 10 vagy 11;
  • internet az online sportadatokhoz.

Az API-kulcsok opcionálisak: nélkülük is elindul az app, csak kevesebb forrás lesz elérhető.

  1. Töltsd le a GitHub Release Courtboard-...-Windows.zip fájlját.
  2. Csomagold ki a teljes ZIP-et egy írható mappába. Ne csak a courtboard.exe fájlt másold ki: a mellette lévő DLL-ek és a data mappa is szükséges.
  3. Indítsd el a courtboard.exe fájlt. PowerShell scriptet nem kell futtatni.
  4. Az appban nyisd meg az Adatforrások oldalt, és add meg azokat az opcionális kulcsokat, amelyekre szükséged van.
  5. Vegyél fel vagy nyiss meg egy sportolót. Az elérhető szolgáltatók automatikusan együtt dolgoznak.

A Basketball Reference integráció közvetlenül Dartban fut, ezért sem Python, sem .venv, sem külön csomagtelepítés nem kell hozzá.

Fordítás forrásból

További szükséges eszközök:

  • Flutter SDK 3.44+ (Dart 3.12+);
  • Visual Studio a Desktop development with C++ workload-dal.
flutter pub get
flutter analyze
flutter test
flutter build windows --release
.\start-courtboard.ps1

A kiadás futtatható fájlja: build\windows\x64\runner\Release\courtboard.exe. GitHubra a Release mappa teljes tartalmát kell ZIP-be csomagolni, a mappaszerkezet megőrzésével.

API-kulcsok

Egyetlen kulcs sem kötelező az app indulásához.

Szolgáltató Mire kell Beállítás az appban Környezeti változó Free keret
API-Sports NBA-profil, foci, korlátozott NFL-integráció API-Sports API_SPORTS_KEY 100 kérés/nap, 10/perc; korlátozott szezonok
BALLDONTLIE NBA-profil kiegészítés BALLDONTLIE BALLDONTLIE_KEY 5 kérés/perc
football-data.org Free ligák focistáinak alapadatai és támogatott klubok mérkőzései football-data.org FOOTBALL_DATA_KEY 12 verseny, 10 kérés/perc
RapidAPI Darts API darts versenylista RapidAPI · Darts + WNBA RAPIDAPI_DARTS_KEY 1000 kérés/hó
RapidAPI WNBA API Player Bio és Advanced Statistics ugyanaz a RapidAPI kulcs RAPIDAPI_DARTS_KEY 100 kérés/hó
Live Tennis API teniszprofil, ranglista, élő és közelgő mérkőzések Live Tennis API LIVE_TENNIS_API_KEY 30 kérés/perc, 1000/nap
YouTube Data API v3 előkészített, még nem aktív automatikus kereső nincs külön mező YOUTUBE_DATA_KEY Google-projektkvóta

A Darts és a WNBA RapidAPI ugyanazt az alkalmazáskulcsot kapja, de a RapidAPI oldalán mindkét API Free csomagjára külön fel kell iratkozni.

Az appban elmentett kulcsok a helyi %APPDATA%\courtboard_state.json fájlba kerülnek. Publikált vagy többfelhasználós kiadásnál kliensbe mentett titkok helyett backend proxyt érdemes használni.

Adatforrás-mátrix

Adatforrás Sport Mi jelenik meg az appban? Kulcs Cache / korlát
API-Sports NBA, NFL, foci NBA profilmezők; befejezett focimeccsek; elérhető friss szezonoknál focista-összesítő; NFL-válasz alapintegráció saját Free 100/nap, 10/perc
BALLDONTLIE NBA közös NBA-profil kiegészítő mezői saját Free 5/perc
TheSportsDB több sport, foci, darts új sportoló képe; NBA-alapadatok; nem támogatott fociligáknál klubmeccsek; darts profil és utolsó 5 eredmény publikus 123 Free legfeljebb 30/perc
football-data.org foci dinamikusan feloldott játékos klubja, posztja, nemzetisége, születési dátuma, mezszáma és azonosítója; támogatott klubok utolsó 5 meccse saját Free 10/perc; csapatkeretek 7 napos lemezcache-ben
FotMob férfi és női foci aktuális vagy előző szezon: csapat, versenysorozat, értékelés, meccs, gól, gólpassz, sárga és piros lap nem kell 6 órás memóriacache; nem hivatalos webes feed
SportsDataverse wehoop WNBA szezonátlagok (perc, pont, lepattanó, assziszt, labdaszerzés, eladott labda, FG%), forma, box score és utolsó meccsek nem kell szezonfájl tartós helyi cache-ben
Basketball Reference NBA, WNBA NBA aktuális szezonátlagok és alapszakasz + playoff utolsó 5 meccs; WNBA utolsó 5 meccs nem kell 6 óra; nem hivatalos webes forrás
ESPN esp.w.1 női foci Aitana Bonmatí / Barcelona Femení utolsó 5 befejezett meccse nem kell nincs publikált kvóta
RapidAPI Darts API darts legfeljebb 8 versenycímke RapidAPI 6 óra; Free 1000/hó
RapidAPI WNBA API WNBA Bio, csapat, 9 statisztika és legfeljebb 4 díj RapidAPI 7 nap; Free 100/hó
Live Tennis API tenisz ranglista és profiladatok; élő szett-, játék- és pontállás; legfeljebb 5 következő meccs saját 10 perc; Free 30/perc és 1000/nap
FOX Sports JSON-oldalfeed NBA, WNBA, foci, tenisz cím, rövid összefoglaló, kép, valódi publikálási dátum és eredeti cikk nem kell sportáganként a legfrissebb 100 cikk/frissítés; 20 perc; tartós helyi archívum
CBS Sports RSS NBA, foci, tenisz cím, rövid összefoglaló, kép, dátum és eredeti cikk nem kell 20 perc; tartós helyi archívum
ESPN RSS NBA, WNBA, foci, tenisz opcionálisan cím, forrás, dátum és kötelező eredeti link nem kell 20 perc; külön bekapcsolandó
Guardian RSS foci, tenisz opcionálisan cím, rövid összefoglaló, kép, dátum és eredeti cikk nem kell 20 perc; személyes, nem kereskedelmi használat
YouTube oEmbed videó kézzel felvett link címe, bélyegképe és megnyitása nem kell helyi playlist
YouTube Data API v3 videó jelenleg semmi; a keresőadapter elő van készítve saját még nincs aktív hívás

Hogyan dolgoznak együtt sportáganként?

NBA

Az API-Sports, a BALLDONTLIE és a TheSportsDB profilhívásai egymástól függetlenül futnak, majd egy közös profilba kerülnek. Egyikük hibája nem dobja el a többiek eredményét. A Basketball Reference közvetlen Dart HTML-feldolgozása adja az aktuális NBA alapszakasz per-game összesítőjét: mérkőzés, perc, pont, összes lepattanó, assziszt, labdaszerzés, eladott labda és FG%. Ugyanez a kliens egészíti ki a profilt az alapszakasz és a rájátszás utolsó öt meccsével.

WNBA

A wehoop adja a teljes aktuális alapszakasz box score-jait. Ezekből az app valódi meccsenkénti átlagot számol a játszott percre, pontra, összes lepattanóra, asszisztra, labdaszerzésre és eladott labdára; az FG% a teljes bedobott és megkísérelt mezőnydobás arányából készül. A wehoop adja továbbá a formaadatot, a meccseket és az ESPN játékosazonosítót. A névfeloldás ékezet- és névsorrend-független, ezért például a Juhász Dorka bevitel a Dorka Juhasz ESPN-rekordhoz és a 4398938 azonosítóhoz illeszkedik. A Basketball Reference külön utolsó 5 meccses forrás. Ha a RapidAPI WNBA előfizetés és kulcs is rendelkezésre áll, az app hozzáadja a Player Bio, Advanced Statistics és díjadatokat, köztük az elérhető TO/TOV mutatót is. A Bio és Advanced hívás egymás után fut, hogy csökkentse a 429 Too Many Requests hibák esélyét.

Foci és női foci

Az API-Sports Free kompatibilis, season alapú mérkőzéslekérést használ. Nem küld last paramétert, mert az a Free csomagban hibát okoz. A focisták Szezon összesítő kártyájához az app megpróbálja az API-Sports játékosstatisztikáját is felhasználni. Mivel a Free csomag jelenleg csak régebbi szezonokat enged, a friss adatokat a kulcs nélküli FotMob feed egészíti ki. Csak a naptári év szerinti aktuális vagy előző szezon fogadható el; régebbi adat nem jelenik meg frissként. Azonos csapat és versenysorozat esetén a két forrás mezői összeolvadnak.

A szezonkártyán a csapat, versenysorozat, értékelésátlag, játszott mérkőzések, gólok, gólpasszok, sárga és piros lapok látszanak. A névfeloldás az ékezeteket és a keresztnév–vezetéknév sorrendet is kezeli. A football-data.org adapter már nem beégetett csapatazonosítókból dolgozik: a Free csapatlistában dinamikusan oldja fel a klubot, majd az aktuális keretben név alapján keresi meg a játékost. A profilkártyán klub, poszt, nemzetiség, születési dátum, mezszám és football-data.org játékosazonosító jelenhet meg. A 12 Free TIER_ONE verseny keretei 7 napos lemezcache-be kerülnek, a lekérések pedig a 10 kérés/perces korláthoz igazodnak.

A football-data.org Free csomag nem ad játékosonkénti meccsaggregációt, ezért a gól-, gólpassz-, lap- és értékelésadatokat továbbra is a FotMob vagy az API-Sports egészíti ki. Ha egy klub ligája nem része a football-data.org Free kínálatának – ilyen az MLS és az Inter Miami –, a csapat utolsó és következő mérkőzéseit a kulcs nélküli TheSportsDB fallback tölti be. Aitana Bonmatí esetén külön ESPN Liga F (esp.w.1) adapter szűri a Barcelona Femení meccseit; férfi Barcelona-eredményt nem kever a profilba.

Darts

A TheSportsDB adja a játékosprofilt és az utolsó 5 eredményt. A Sportbex RapidAPI Darts API a versenykínálatot egészíti ki. Bár az API eseményeket, piacokat és oddsokat is kínál, a Courtboard jelenleg csak a competitions/3503 végpontot jeleníti meg.

NFL

Az API-Sports adapter és válaszkezelés be van kötve, de a részletes, játékosonkénti NFL megjelenítés jelenleg még korlátozott. Az Adatforrás-kézikönyv ezt nem jelöli teljes értékű statisztikai feednek.

Tenisz

Új sportoló felvételekor válaszd a Tenisz sportágat; csapatot nem kell megadni. A Live Tennis API kulcsa az Adatforrások oldalon menthető. A név szerinti játékoskeresés ékezet- és névsorrend-független, majd a részletes profilból az app megjeleníti az aktuális ranglistát, ranglistapontot, sorozatot, országot, ütőkezet, fonákot és születési dátumot.

Az élő mérkőzésnél az ellenfél, a verseny, a szett-, játék- és pontállás látható. A közelgő meccseket az azonosítóval rendelkező upcoming feed és a név alapú fixture lista együtt tölti ki. A játékos saját sorozatkódját csak akkor küldjük szűrőként, ha egyértelműen atp vagy wta, mert az alsóbb sorozatok profilkódjai eltérnek az API szűrőértékeitől.

A Free csomaghoz tartozó completed, /history, piac-, modell- és WebSocket-végpontokat az app nem hívja. Egy profil friss betöltése legfeljebb öt kvótás kérést használ, a /usage ellenőrzés kvótamentes; a 10 perces lemezcache védi a napi 1000 kéréses keretet. A kézi frissítés tudatosan megkerüli a cache-t.

Hírek és tartós hírarchívum

A Hírek oldal alapból a FOX Sports és a CBS Sports NBA-, WNBA-, foci- és teniszforrásait dolgozza fel. A FOX optimalizált RSS-feedjei egyenetlenek voltak: a WNBA legújabb eleme hónapokkal korábbi, a teniszfeed pedig több éves cikkeket is tartalmazott. Ezért mind a négy FOX sportág a FOX weboldalak által is használt aktuális JSON-hírfolyamból érkezik. Sportáganként kérésenként a legfrissebb 100 cikket kapjuk; a helyi archívum az újabb frissítésekkel tovább növekszik. A forráskezelőben az ESPN és a Guardian feedjei külön kapcsolhatók be.

A helyi adatbázis mindig azonnal betöltődik, a hálózati frissítés csak utána fut, ezért egy hibás vagy átmenetileg nem elérhető forrás nem tünteti el a korábbi híreket. A kártyán mindig a cikk publikálási dátuma jelenik meg, nem a letöltés ideje. Az adatbázis-migráció eltávolítja az első kiadás FOX-elemeit, amelyeknél a hibás időzóna-feldolgozás miatt a lekérési idő került publikálási dátumként tárolásra; a következő frissítés helyes dátummal tölti vissza őket.

  • Az automatikus frissítési ablak 20 perc; a Frissítés gomb tudatosan megkerüli ezt az időkorlátot.
  • A letöltött hírek SQLite-adatbázisba kerülnek, és az app nem törli őket automatikusan. Így hónapokkal később és hálózat nélkül is kereshetők maradnak.
  • A deduplikáció elsősorban kanonizált URL, ennek hiányában GUID alapján történik. Egy hír több sportághoz és több feedhez is kapcsolódhat anélkül, hogy duplán jelenne meg.
  • A feldolgozó kezeli az RSS, Atom és FOX JSON eltéréseit, az RFC 822 numerikus időzóna-eltolásokat, valamint az ESPN EST/EDT jelöléseit. A leírás HTML-entitásait dekódolja, eltávolítja a script, style, noscript elemeket és a tageket, normalizálja a whitespace-t, majd legfeljebb 350 karaktert tárol.
  • A keresés a címben és az összefoglalóban fut. A sportoló szerinti illesztés ékezet- és névsorrend-független tokenekkel működik.
  • A tárolt kép az RSS-ben kapott külső kép-URL; maga a képfájl nincs archiválva. A cím, összefoglaló, dátum, forrás és eredeti link viszont tartósan megmarad.
  • A hírmodell egy NewsProvider interfészen keresztül kap adatot, ezért később RSS mellett hírszolgáltatói API vagy más importforrás is hozzáadható az adatbázis és a felület átírása nélkül.

Az ESPN-tartalomnál a Courtboard csak a feed által átadott címet és metaadatokat használja, jól láthatóan feltünteti a forrást, és mindig az eredeti ESPN-cikkre linkel. Az ESPN-feed köré nem szabad reklámot helyezni. A Guardian feedjei személyes, nem kereskedelmi használatra kapcsolhatók be. A FOX és más szolgáltatók feltételei változhatnak; nyilvános vagy üzleti terjesztés előtt a mindenkori felhasználási feltételeket újra ellenőrizni kell.

Profilképek és videók

Új sportoló felvételekor a TheSportsDB név szerinti keresése próbál profilképet találni. Ha nincs találat, az app monogramot mutat.

A sportolói profilon a felhasználó YouTube URL-t vagy videóazonosítót adhat meg. A cím és bélyegkép a kulcs nélküli YouTube oEmbed válaszból érkezik. A mentések a központi Videók oldalon is megjelennek, ahol cím, sportoló és sportág szerint kereshetők, lejátszhatók vagy eltávolíthatók. A Courtboard nem ír a YouTube-fiókba, és nem hoz létre távoli playlistet. A YouTube Data API keresőadaptere létezik, de jelenleg nincs bekötve automatikus keresési felületre.

Helyi adatok és cache-ek

Fájl vagy mappa Tartalom Élettartam
%APPDATA%\courtboard_state.json saját sportolók, jegyzetek, figyelések, API-kulcsok, téma és rendezési beállítások amíg a felhasználó nem törli
%APPDATA%\courtboard_playlist.json mentett YouTube videóazonosítók amíg a felhasználó nem törli
%APPDATA%\courtboard\wnba_cache wehoop WNBA szezon CSV-k tartós
%APPDATA%\courtboard_cache\basketball_reference NBA/WNBA meccsek 6 óra
%APPDATA%\courtboard_cache\rapidapi_darts darts versenylista 6 óra
%APPDATA%\courtboard_cache\rapidapi_wnba WNBA bio és advanced stat 7 nap; hibánál a régebbi mentés is használható
%APPDATA%\courtboard_cache\football_data\free_players.json football-data.org Free csapatkeretek és játékos-alapadatok 7 nap; hálózati hibánál a régebbi mentés is használható
%APPDATA%\courtboard_cache\live_tennis teniszprofil, élő és közelgő mérkőzések, kvótaállapot 10 perc
%APPDATA%\Courtboard\courtboard_news.sqlite letöltött hírek, sport- és forráskapcsolatok, feedbeállítások és frissítési állapot tartós; nincs automatikus törlés

Hibaelhárítás

free plans do not have access to the Last parameter

Friss buildet használj. A focilekérés már nem küldi a Free csomagban tiltott last paramétert, hanem támogatott szezonból kér befejezett mérkőzéseket.

429 Too Many Requests

Elérted a szolgáltató percenkénti vagy havi kvótáját. Várj a kvótaablak végéig. A WNBA RapidAPI-hívások szekvenciálisak, a kis keretű szolgáltatások pedig lemezcache-t használnak.

Nincs NBA/WNBA utolsó mérkőzés

Ellenőrizd az internetkapcsolatot, majd indítsd újra az appot. A Basketball Reference közvetlenül az oldal HTML-tábláit tölti le; Python nem szükséges. Friss hálózati válasz hiányában az app a korábbi lemezcache-t próbálja használni, majd a többi NBA/WNBA-forrásra esik vissza.

Egy API-kulcs hiányzik

Az app ettől még működik. Az Adatforrások oldalon a kártya KULCS HIÁNYZIK állapotot mutat, és részletesen leírja, mely adatok maradnak el. A kulcsot ott helyben elmentheted, vagy felhasználói környezeti változóként is beállíthatod, például:

[Environment]::SetEnvironmentVariable('API_SPORTS_KEY', 'SAJAT_KULCS', 'User')

Környezeti változó módosítása után indítsd újra az alkalmazást.

Egy hírforrás nem frissül

A Hírek → Források ablakban ellenőrizd, hogy a feed be van-e kapcsolva, és nézd meg az utolsó sikeres frissítés vagy hiba állapotát. A korábban letöltött archívum feedhiba esetén is megmarad. Automatikusan legfeljebb 20 percenként kér új adatot az app; az azonnali újrapróbáláshoz használd a Frissítés gombot.

Fejlesztői ellenőrzés

dart format lib test
flutter analyze
flutter test
flutter build windows --release

Az adatforrások központi, kereshető leírása a lib/data/provider_catalog.dart fájlban van. Új integráció felvételekor ezt a katalógust és a README mátrixát együtt kell frissíteni.

A Flutter belépési pontja szándékosan kicsi: a lib/main.dart az importokat és a part deklarációkat tartalmazza, a képernyők és profilmodulok pedig sportág és funkció szerint a lib/ui/ fájljaiban találhatók. Így egy adatforrás vagy nézet fejlesztéséhez nem kell egy több ezer soros központi fájlt módosítani.

Szolgáltatói dokumentáció

About

Multi-source Windows sports athlete tracker built with Flutter

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages