Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 25 additions & 25 deletions plugins.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,10 @@
"plugin_path": "plugins/baseball-scoreboard",
"stars": 0,
"downloads": 0,
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "1.22.1"
"latest_version": "1.22.2"
},
{
"id": "basketball-scoreboard",
Expand All @@ -101,7 +101,7 @@
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "1.10.2"
"latest_version": "1.10.3"
},
{
"id": "calendar",
Expand Down Expand Up @@ -212,10 +212,10 @@
"plugin_path": "plugins/f1-scoreboard",
"stars": 0,
"downloads": 0,
"last_updated": "2026-08-01",
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "1.7.2"
"latest_version": "1.7.3"
},
{
"id": "football-scoreboard",
Expand All @@ -237,10 +237,10 @@
"plugin_path": "plugins/football-scoreboard",
"stars": 0,
"downloads": 0,
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "2.11.1"
"latest_version": "2.11.2"
},
{
"id": "geochron",
Expand Down Expand Up @@ -335,7 +335,7 @@
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "1.7.2",
"latest_version": "1.7.3",
"icon": "fas fa-hockey-puck"
},
{
Expand All @@ -359,7 +359,7 @@
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "1.7.2",
"latest_version": "1.7.3",
"icon": "fas fa-baseball-ball"
},
{
Expand Down Expand Up @@ -460,10 +460,10 @@
"plugin_path": "plugins/march-madness",
"stars": 0,
"downloads": 0,
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "1.0.3"
"latest_version": "1.0.4"
},
{
"id": "masters-tournament",
Expand All @@ -484,10 +484,10 @@
"plugin_path": "plugins/masters-tournament",
"stars": 0,
"downloads": 0,
"last_updated": "2026-07-17",
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "2.5.3"
"latest_version": "2.5.4"
},
{
"id": "mqtt-notifications",
Expand Down Expand Up @@ -554,10 +554,10 @@
"plugin_path": "plugins/news",
"stars": 0,
"downloads": 0,
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "1.3.0"
"latest_version": "1.3.1"
},
{
"id": "on-air",
Expand Down Expand Up @@ -602,10 +602,10 @@
"plugin_path": "plugins/nfl-draft",
"stars": 0,
"downloads": 0,
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "1.4.0",
"latest_version": "1.4.1",
"icon": "fas fa-football-ball"
},
{
Expand Down Expand Up @@ -757,10 +757,10 @@
"plugin_path": "plugins/soccer-scoreboard",
"stars": 0,
"downloads": 0,
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "2.6.1"
"latest_version": "2.6.2"
},
{
"id": "static-image",
Expand Down Expand Up @@ -902,10 +902,10 @@
"plugin_path": "plugins/ufc-scoreboard",
"stars": 0,
"downloads": 0,
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "1.3.2",
"latest_version": "1.3.3",
"icon": "fas fa-fist-raised"
},
{
Expand Down Expand Up @@ -1048,8 +1048,8 @@
"downloads": 0,
"verified": true,
"screenshot": "",
"latest_version": "1.3.1",
"last_updated": "2026-07-31"
"latest_version": "1.3.2",
"last_updated": "2026-08-05"
},
{
"id": "tidbyt-baseball-scoreboard",
Expand Down Expand Up @@ -1092,10 +1092,10 @@
"plugin_path": "plugins/nrl-scoreboard",
"stars": 0,
"downloads": 0,
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"verified": true,
"screenshot": "",
"latest_version": "1.3.1"
"latest_version": "1.3.2"
},
{
"id": "jellyfin-now-playing",
Expand Down
2 changes: 1 addition & 1 deletion plugins/afl-scoreboard/data_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def fetch_standings(self, sport: str, league: str) -> Dict:
def get_headers(self) -> Dict[str, str]:
"""Get headers for API requests."""
return {
'User-Agent': 'LEDMatrix/1.0',
'User-Agent': 'LEDMatrix/1.0 (+https://github.com/ChuckBuilds/LEDMatrix)',
'Accept': 'application/json'
}

Expand Down
10 changes: 8 additions & 2 deletions plugins/afl-scoreboard/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "afl-scoreboard",
"name": "AFL Scoreboard",
"version": "1.3.1",
"version": "1.3.2",
"author": "ChuckBuilds",
"description": "Live, recent, and upcoming AFL (Australian Football League) games with real-time scores and game status.",
"category": "sports",
Expand All @@ -18,6 +18,12 @@
"afl_upcoming"
],
"versions": [
{
"version": "1.3.2",
"released": "2026-08-05",
"notes": "Fix ESPN 403s. Around 2026-08-04 ESPN's site.api began rejecting both browser-style and bare custom User-Agent strings, which returned 403 Forbidden for every request this plugin made. Requests now send an identifying agent with the project URL, which ESPN accepts. No behaviour change beyond the header.",
"ledmatrix_min_version": "2.0.0"
},
{
"version": "1.3.1",
"released": "2026-08-05",
Expand Down Expand Up @@ -70,7 +76,7 @@
"ledmatrix_min": "2.0.0"
}
],
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"stars": 0,
"downloads": 0,
"verified": true,
Expand Down
2 changes: 1 addition & 1 deletion plugins/baseball-scoreboard/data_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def fetch_standings(self, sport: str, league: str) -> Dict:
def get_headers(self) -> Dict[str, str]:
"""Get headers for API requests."""
return {
'User-Agent': 'LEDMatrix/1.0',
'User-Agent': 'LEDMatrix/1.0 (+https://github.com/ChuckBuilds/LEDMatrix)',
'Accept': 'application/json'
}

Expand Down
2 changes: 1 addition & 1 deletion plugins/baseball-scoreboard/dynamic_team_resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ def _fetch_rankings(self, sport: str) -> List[str]:
url = f"https://site.api.espn.com/apis/site/v2/sports/{endpoint}"

headers = {
'User-Agent': 'LEDMatrix/1.0',
'User-Agent': 'LEDMatrix/1.0 (+https://github.com/ChuckBuilds/LEDMatrix)',
'Accept': 'application/json'
}

Expand Down
2 changes: 1 addition & 1 deletion plugins/baseball-scoreboard/logo_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ def _download_headshot_image(self, url: str) -> Optional[Image.Image]:
allowlisted by the caller."""
resp = requests.get(
url, timeout=5, stream=True,
headers={"User-Agent": "LEDMatrix Baseball Plugin/1.0"},
headers={"User-Agent": "LEDMatrix/1.0 (+https://github.com/ChuckBuilds/LEDMatrix)"},
)
try:
resp.raise_for_status()
Expand Down
10 changes: 8 additions & 2 deletions plugins/baseball-scoreboard/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "baseball-scoreboard",
"name": "Baseball Scoreboard",
"version": "1.22.1",
"version": "1.22.2",
"author": "ChuckBuilds",
"description": "Live, recent, and upcoming baseball games across MLB, MiLB, and NCAA Baseball with real-time scores and schedules",
"category": "sports",
Expand Down Expand Up @@ -30,6 +30,12 @@
"branch": "main",
"plugin_path": "plugins/baseball-scoreboard",
"versions": [
{
"version": "1.22.2",
"released": "2026-08-05",
"notes": "Fix ESPN 403s. Around 2026-08-04 ESPN's site.api began rejecting both browser-style and bare custom User-Agent strings, which returned 403 Forbidden for every request this plugin made. Requests now send an identifying agent with the project URL, which ESPN accepts. No behaviour change beyond the header.",
"ledmatrix_min_version": "2.0.0"
},
{
"version": "1.22.1",
"released": "2026-08-05",
Expand Down Expand Up @@ -315,7 +321,7 @@
"ledmatrix_min_version": "2.0.0"
}
],
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"stars": 0,
"downloads": 0,
"verified": true,
Expand Down
2 changes: 1 addition & 1 deletion plugins/basketball-scoreboard/data_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def fetch_standings(self, sport: str, league: str) -> Dict:
def get_headers(self) -> Dict[str, str]:
"""Get headers for API requests."""
return {
'User-Agent': 'LEDMatrix/1.0',
'User-Agent': 'LEDMatrix/1.0 (+https://github.com/ChuckBuilds/LEDMatrix)',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Files:"
git ls-files | rg '(^|/)plugins/(basketball-scoreboard|f1-scoreboard)/(data_sources|f1_data)\.py$' || true

echo
echo "basketball data_sources outline:"
ast-grep outline plugins/basketball-scoreboard/data_sources.py --view expanded || true

echo
echo "basketball relevant lines:"
cat -n plugins/basketball-scoreboard/data_sources.py | sed -n '1,160p'

echo
echo "f1 f1_data outline:"
ast-grep outline plugins/f1-scoreboard/f1_data.py --view expanded || true

echo
echo "f1 relevant lines:"
cat -n plugins/f1-scoreboard/f1_data.py | sed -n '1,180p'

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 19333


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "soccer class and call sites:"
cat -n plugins/basketball-scoreboard/data_sources.py | sed -n '160,340p'

echo
echo "F1 requests using _fetch_json / bases:"
python3 - <<'PY'
from pathlib import Path
p = Path('plugins/f1-scoreboard/f1_data.py')
s = p.read_text()
bases = ['ESPN_BASE', 'JOLPI_BASE', 'OPENF1_BASE']
for i,line in enumerate(s.splitlines(),1):
    if '_fetch_json(' in line or any(b in line for b in bases):
        print(f'{i}: {line}')
PY

echo
echo "rest of F1 relevant _fetch_json usage:"
cat -n plugins/f1-scoreboard/f1_data.py | sed -n '108,90p' | sed -n '1,80p'
cat -n plugins/f1-scoreboard/f1_data.py | sed -n '138,750p' | grep -n "_fetch_json\|ESPN_BASE\|JOLPI_BASE\|OPENF1_BASE" || true

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 10109


Scope the new User-Agent per service.

Both locations send the shared User-Agent beyond ESPN calls.

  • plugins/basketball-scoreboard/data_sources.py: SoccerAPIDataSource.get_headers() calls super().get_headers() and also uses MLBAPIDataSource, so keep this value only for ESPN requests or override it in the non-ESPN classes.
  • plugins/f1-scoreboard/f1_data.py: _fetch_json() is used by Jolpi and OpenF1 callers too, so override headers only for ESPN or use separate service sessions.
📍 Affects 2 files
  • plugins/basketball-scoreboard/data_sources.py#L49-L49 (this comment)
  • plugins/f1-scoreboard/f1_data.py#L55-L55
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/basketball-scoreboard/data_sources.py` at line 49, Scope the shared
User-Agent to ESPN requests only: in
plugins/basketball-scoreboard/data_sources.py at lines 49-49, update
SoccerAPIDataSource.get_headers() and MLBAPIDataSource usage so non-ESPN
requests do not inherit it; in plugins/f1-scoreboard/f1_data.py at lines 55-55,
update _fetch_json() to apply the header only for ESPN calls or use separate
service-specific sessions, preserving appropriate headers for Jolpi and OpenF1.

'Accept': 'application/json'
}

Expand Down
2 changes: 1 addition & 1 deletion plugins/basketball-scoreboard/dynamic_team_resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ def _fetch_rankings(self, sport: str) -> List[str]:
url = f"https://site.api.espn.com/apis/site/v2/sports/{endpoint}"

headers = {
'User-Agent': 'LEDMatrix/1.0',
'User-Agent': 'LEDMatrix/1.0 (+https://github.com/ChuckBuilds/LEDMatrix)',
'Accept': 'application/json'
}

Expand Down
8 changes: 7 additions & 1 deletion plugins/basketball-scoreboard/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "basketball-scoreboard",
"name": "Basketball Scoreboard",
"version": "1.10.2",
"version": "1.10.3",
"description": "Live, recent, and upcoming basketball games across NBA, NCAA Men's, NCAA Women's, and WNBA with real-time scores, schedules, and March Madness tournament support",
"author": "ChuckBuilds",
"category": "sports",
Expand All @@ -18,6 +18,12 @@
"branch": "main",
"plugin_path": "plugins/basketball-scoreboard",
"versions": [
{
"version": "1.10.3",
"released": "2026-08-05",
"notes": "Fix ESPN 403s. Around 2026-08-04 ESPN's site.api began rejecting both browser-style and bare custom User-Agent strings, which returned 403 Forbidden for every request this plugin made. Requests now send an identifying agent with the project URL, which ESPN accepts. No behaviour change beyond the header.",
"ledmatrix_min_version": "2.0.0"
},
{
"version": "1.10.2",
"released": "2026-08-05",
Expand Down
2 changes: 1 addition & 1 deletion plugins/f1-scoreboard/f1_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def __init__(self, cache_manager=None, config: Dict[str, Any] = None):
self.session.mount("https://", adapter)
self.session.mount("http://", adapter)
self.session.headers.update({
"User-Agent": "LEDMatrix-F1/1.0",
"User-Agent": "LEDMatrix/1.0 (+https://github.com/ChuckBuilds/LEDMatrix)",
"Accept": "application/json",
})

Expand Down
10 changes: 8 additions & 2 deletions plugins/f1-scoreboard/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "f1-scoreboard",
"name": "F1 Scoreboard",
"version": "1.7.2",
"version": "1.7.3",
"author": "ChuckBuilds",
"class_name": "F1ScoreboardPlugin",
"entry_point": "manager.py",
Expand Down Expand Up @@ -29,6 +29,12 @@
"f1_calendar"
],
"versions": [
{
"version": "1.7.3",
"released": "2026-08-05",
"notes": "Fix ESPN 403s. Around 2026-08-04 ESPN's site.api began rejecting both browser-style and bare custom User-Agent strings, which returned 403 Forbidden for every request this plugin made. Requests now send an identifying agent with the project URL, which ESPN accepts. No behaviour change beyond the header.",
"ledmatrix_min_version": "2.0.0"
},
{
"released": "2026-08-02",
"version": "1.7.2",
Expand Down Expand Up @@ -238,7 +244,7 @@
"ledmatrix_min_version": "2.0.0"
}
],
"last_updated": "2026-08-01",
"last_updated": "2026-08-05",
"stars": 0,
"downloads": 0,
"verified": true,
Expand Down
2 changes: 1 addition & 1 deletion plugins/football-scoreboard/data_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def fetch_standings(self, sport: str, league: str) -> Dict:
def get_headers(self) -> Dict[str, str]:
"""Get headers for API requests."""
return {
'User-Agent': 'LEDMatrix/1.0',
'User-Agent': 'LEDMatrix/1.0 (+https://github.com/ChuckBuilds/LEDMatrix)',
'Accept': 'application/json'
}

Expand Down
2 changes: 1 addition & 1 deletion plugins/football-scoreboard/dynamic_team_resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ def _fetch_rankings(self, sport: str) -> List[str]:
url = f"https://site.api.espn.com/apis/site/v2/sports/{endpoint}"

headers = {
'User-Agent': 'LEDMatrix/1.0',
'User-Agent': 'LEDMatrix/1.0 (+https://github.com/ChuckBuilds/LEDMatrix)',
'Accept': 'application/json'
}

Expand Down
10 changes: 8 additions & 2 deletions plugins/football-scoreboard/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "football-scoreboard",
"name": "Football Scoreboard",
"version": "2.11.1",
"version": "2.11.2",
"author": "ChuckBuilds",
"class_name": "FootballScoreboardPlugin",
"description": "Standalone plugin for live, recent, and upcoming football games across NFL and NCAA Football with real-time scores, down/distance, possession, and game status. Now with organized nested config!",
Expand All @@ -24,6 +24,12 @@
"ncaa_fb_live"
],
"versions": [
{
"version": "2.11.2",
"released": "2026-08-05",
"notes": "Fix ESPN 403s. Around 2026-08-04 ESPN's site.api began rejecting both browser-style and bare custom User-Agent strings, which returned 403 Forbidden for every request this plugin made. Requests now send an identifying agent with the project URL, which ESPN accepts. No behaviour change beyond the header.",
"ledmatrix_min_version": "2.0.0"
},
{
"version": "2.11.1",
"released": "2026-08-05",
Expand Down Expand Up @@ -331,7 +337,7 @@
"ledmatrix_min_version": "2.0.0"
}
],
"last_updated": "2026-07-31",
"last_updated": "2026-08-05",
"stars": 0,
"downloads": 0,
"verified": true,
Expand Down
Loading
Loading