diff --git a/README.md b/README.md index 812a069d..e9309380 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ curl -X POST http://your-pi-ip:5000/api/v3/plugins/install \ | [Baseball Scoreboard](./plugins/baseball-scoreboard/) | MLB, MiLB & NCAA Baseball live scores | baseball-scoreboard on an LED panel | | [Soccer Scoreboard](./plugins/soccer-scoreboard/) | Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS | | | [Lacrosse Scoreboard](./plugins/lacrosse-scoreboard/) | NCAA lacrosse live scores and schedules | | -| [Cricket Scoreboard](./plugins/cricket-scoreboard/) | Live, recent & upcoming international (Test/ODI/T20I) and major domestic cricket | | +| [Cricket Scoreboard](./plugins/cricket-scoreboard/) | Live, recent & upcoming international (Test/ODI/T20I) and major domestic cricket | cricket-scoreboard on an LED panel | | [AFL Scoreboard](./plugins/afl-scoreboard/) | Australian Football League live, recent & upcoming games | afl-scoreboard on an LED panel | | [NRL Scoreboard](./plugins/nrl-scoreboard/) | National Rugby League live, recent & upcoming games | | | [F1 Scoreboard](./plugins/f1-scoreboard/) | Formula 1 race results, schedules, and standings | | diff --git a/docs/assets/cricket-scoreboard/display-modes.png b/docs/assets/cricket-scoreboard/display-modes.png new file mode 100644 index 00000000..768306d7 Binary files /dev/null and b/docs/assets/cricket-scoreboard/display-modes.png differ diff --git a/docs/assets/cricket-scoreboard/hero.png b/docs/assets/cricket-scoreboard/hero.png new file mode 100644 index 00000000..2ec74d6c Binary files /dev/null and b/docs/assets/cricket-scoreboard/hero.png differ diff --git a/docs/assets/cricket-scoreboard/panel-sizes.png b/docs/assets/cricket-scoreboard/panel-sizes.png new file mode 100644 index 00000000..df62d9cd Binary files /dev/null and b/docs/assets/cricket-scoreboard/panel-sizes.png differ diff --git a/docs/assets/cricket-scoreboard/shots.json b/docs/assets/cricket-scoreboard/shots.json new file mode 100644 index 00000000..7d2241ce --- /dev/null +++ b/docs/assets/cricket-scoreboard/shots.json @@ -0,0 +1,475 @@ +{ + "plugin": "cricket-scoreboard", + "_comment": "Matches are seeded onto the plugin instance rather than fetched, and _last_update is seeded so display() does not re-fetch and clear them. Teams, scores and venues are invented but shaped like the plugin's normalised match records.", + "defaults": { + "width": 128, + "height": 32, + "scale": 6, + "freeze_time": "2026-09-13T12:00:00+00:00", + "skip_update": true, + "config": { + "enabled": true + }, + "attrs": { + "live_matches": [ + { + "name": "3rd ODI", + "format": "ODI", + "period": "2nd Innings", + "status_short": "LIVE", + "status_summary": "IND need 48 runs", + "venue": "Eden Gardens", + "target": 287, + "start_time_utc": "2026-09-13T08:30:00Z", + "teams": [ + { + "abbr": "AUS", + "short_name": "AUS", + "name": "Australia", + "innings": [ + { + "runs": 286, + "wickets": 8, + "overs_raw": 50.0, + "is_batting": false, + "score_str": "286/8" + } + ], + "score_str": "286/8" + }, + { + "abbr": "IND", + "short_name": "IND", + "name": "India", + "innings": [ + { + "runs": 239, + "wickets": 4, + "overs_raw": 42.3, + "is_batting": true, + "score_str": "239/4" + } + ], + "score_str": "239/4" + } + ] + } + ], + "recent_matches": [ + { + "name": "2nd Test", + "format": "Test", + "period": "Day 4", + "status_short": "FT", + "status_summary": "ENG won by 5 wickets", + "venue": "Lord's", + "target": null, + "start_time_utc": "2026-09-09T10:00:00Z", + "teams": [ + { + "abbr": "NZ", + "short_name": "NZ", + "name": "New Zealand", + "innings": [ + { + "runs": 301, + "wickets": 10, + "overs_raw": 92.4, + "is_batting": false, + "score_str": "301" + } + ], + "score_str": "301" + }, + { + "abbr": "ENG", + "short_name": "ENG", + "name": "England", + "innings": [ + { + "runs": 305, + "wickets": 5, + "overs_raw": 78.2, + "is_batting": false, + "score_str": "305/5" + } + ], + "score_str": "305/5" + } + ] + } + ], + "upcoming_matches": [ + { + "name": "1st T20I", + "format": "T20", + "period": "", + "status_short": "", + "status_summary": "Starts 19:00", + "venue": "Newlands", + "target": null, + "start_time_utc": "2026-09-15T17:00:00Z", + "teams": [ + { + "abbr": "SA", + "short_name": "SA", + "name": "South Africa", + "innings": [] + }, + { + "abbr": "PAK", + "short_name": "PAK", + "name": "Pakistan", + "innings": [] + } + ] + } + ], + "_last_update": 1789286400.0, + "is_enabled": true + } + }, + "shots": [ + { + "name": "hero" + }, + { + "name": "mode-live", + "standalone": false, + "attrs": { + "live_matches": [ + { + "name": "3rd ODI", + "format": "ODI", + "period": "2nd Innings", + "status_short": "LIVE", + "status_summary": "IND need 48 runs", + "venue": "Eden Gardens", + "target": 287, + "start_time_utc": "2026-09-13T08:30:00Z", + "teams": [ + { + "abbr": "AUS", + "short_name": "AUS", + "name": "Australia", + "innings": [ + { + "runs": 286, + "wickets": 8, + "overs_raw": 50.0, + "is_batting": false, + "score_str": "286/8" + } + ], + "score_str": "286/8" + }, + { + "abbr": "IND", + "short_name": "IND", + "name": "India", + "innings": [ + { + "runs": 239, + "wickets": 4, + "overs_raw": 42.3, + "is_batting": true, + "score_str": "239/4" + } + ], + "score_str": "239/4" + } + ] + } + ], + "recent_matches": [], + "upcoming_matches": [], + "_last_update": 1789286400.0, + "is_enabled": true + } + }, + { + "name": "mode-recent", + "standalone": false, + "attrs": { + "live_matches": [], + "recent_matches": [ + { + "name": "2nd Test", + "format": "Test", + "period": "Day 4", + "status_short": "FT", + "status_summary": "ENG won by 5 wickets", + "venue": "Lord's", + "target": null, + "start_time_utc": "2026-09-09T10:00:00Z", + "teams": [ + { + "abbr": "NZ", + "short_name": "NZ", + "name": "New Zealand", + "innings": [ + { + "runs": 301, + "wickets": 10, + "overs_raw": 92.4, + "is_batting": false, + "score_str": "301" + } + ], + "score_str": "301" + }, + { + "abbr": "ENG", + "short_name": "ENG", + "name": "England", + "innings": [ + { + "runs": 305, + "wickets": 5, + "overs_raw": 78.2, + "is_batting": false, + "score_str": "305/5" + } + ], + "score_str": "305/5" + } + ] + } + ], + "upcoming_matches": [], + "_last_update": 1789286400.0, + "is_enabled": true + } + }, + { + "name": "mode-upcoming", + "standalone": false, + "attrs": { + "live_matches": [], + "recent_matches": [], + "upcoming_matches": [ + { + "name": "1st T20I", + "format": "T20", + "period": "", + "status_short": "", + "status_summary": "Starts 19:00", + "venue": "Newlands", + "target": null, + "start_time_utc": "2026-09-15T17:00:00Z", + "teams": [ + { + "abbr": "SA", + "short_name": "SA", + "name": "South Africa", + "innings": [] + }, + { + "abbr": "PAK", + "short_name": "PAK", + "name": "Pakistan", + "innings": [] + } + ] + } + ], + "_last_update": 1789286400.0, + "is_enabled": true + } + }, + { + "name": "venue-on", + "standalone": false, + "attrs": { + "live_matches": [], + "recent_matches": [ + { + "name": "2nd Test", + "format": "Test", + "period": "Day 4", + "status_short": "FT", + "status_summary": "ENG won by 5 wickets", + "venue": "Lord's", + "target": null, + "start_time_utc": "2026-09-09T10:00:00Z", + "teams": [ + { + "abbr": "NZ", + "short_name": "NZ", + "name": "New Zealand", + "innings": [ + { + "runs": 301, + "wickets": 10, + "overs_raw": 92.4, + "is_batting": false, + "score_str": "301" + } + ], + "score_str": "301" + }, + { + "abbr": "ENG", + "short_name": "ENG", + "name": "England", + "innings": [ + { + "runs": 305, + "wickets": 5, + "overs_raw": 78.2, + "is_batting": false, + "score_str": "305/5" + } + ], + "score_str": "305/5" + } + ] + } + ], + "upcoming_matches": [], + "_last_update": 1789286400.0, + "is_enabled": true + }, + "config": { + "show_venue": true + } + }, + { + "name": "venue-off", + "standalone": false, + "attrs": { + "live_matches": [], + "recent_matches": [ + { + "name": "2nd Test", + "format": "Test", + "period": "Day 4", + "status_short": "FT", + "status_summary": "ENG won by 5 wickets", + "venue": "Lord's", + "target": null, + "start_time_utc": "2026-09-09T10:00:00Z", + "teams": [ + { + "abbr": "NZ", + "short_name": "NZ", + "name": "New Zealand", + "innings": [ + { + "runs": 301, + "wickets": 10, + "overs_raw": 92.4, + "is_batting": false, + "score_str": "301" + } + ], + "score_str": "301" + }, + { + "abbr": "ENG", + "short_name": "ENG", + "name": "England", + "innings": [ + { + "runs": 305, + "wickets": 5, + "overs_raw": 78.2, + "is_batting": false, + "score_str": "305/5" + } + ], + "score_str": "305/5" + } + ] + } + ], + "upcoming_matches": [], + "_last_update": 1789286400.0, + "is_enabled": true + }, + "config": { + "show_venue": false + } + }, + { + "name": "size-64x32", + "width": 64, + "standalone": false + }, + { + "name": "size-128x32", + "width": 128, + "standalone": false + }, + { + "name": "size-128x64", + "width": 128, + "height": 64, + "standalone": false + }, + { + "name": "size-256x32", + "width": 256, + "standalone": false + } + ], + "composites": [ + { + "name": "display-modes", + "columns": 1, + "cells": [ + { + "shot": "mode-live", + "label": "cricket_live", + "sublabel": "batting side in the accent colour, overs and run rate below" + }, + { + "shot": "mode-recent", + "label": "cricket_recent", + "sublabel": "the finished match and its result" + }, + { + "shot": "mode-upcoming", + "label": "cricket_upcoming", + "sublabel": "the fixture, with no score yet" + } + ] + }, + { + "name": "show-venue", + "columns": 1, + "cells": [ + { + "shot": "venue-on", + "label": "show_venue: true" + }, + { + "shot": "venue-off", + "label": "show_venue: false" + } + ] + }, + { + "name": "panel-sizes", + "columns": 2, + "cells": [ + { + "shot": "size-64x32", + "label": "64 x 32" + }, + { + "shot": "size-128x32", + "label": "128 x 32" + }, + { + "shot": "size-128x64", + "label": "128 x 64" + }, + { + "shot": "size-256x32", + "label": "256 x 32" + } + ] + } + ] +} diff --git a/docs/assets/cricket-scoreboard/show-venue.png b/docs/assets/cricket-scoreboard/show-venue.png new file mode 100644 index 00000000..0d729530 Binary files /dev/null and b/docs/assets/cricket-scoreboard/show-venue.png differ diff --git a/plugins.json b/plugins.json index f818927f..7822db03 100644 --- a/plugins.json +++ b/plugins.json @@ -24,10 +24,10 @@ "plugin_path": "plugins/cricket-scoreboard", "stars": 0, "downloads": 0, - "last_updated": "2026-07-17", + "last_updated": "2026-09-03", "verified": true, "screenshot": "", - "latest_version": "1.1.1" + "latest_version": "1.1.2" }, { "id": "7-segment-clock", diff --git a/plugins/cricket-scoreboard/README.md b/plugins/cricket-scoreboard/README.md index 375bb0be..02669e88 100644 --- a/plugins/cricket-scoreboard/README.md +++ b/plugins/cricket-scoreboard/README.md @@ -1,5 +1,13 @@ # Cricket Scoreboard +![A live ODI on a 128x32 panel: both flags, the batting side's score in green +above the other side's, and overs, run rate and target +below](../../docs/assets/cricket-scoreboard/hero.png) + +*Every image in this README is real plugin output, rendered at the true panel +size from seeded matches so it reproduces exactly. Teams, scores and venues are +invented.* + Live, recent, and upcoming cricket for the LEDMatrix display — covering both **international** matches (Test / ODI / T20I) and the **major domestic T20 leagues** (IPL, Big Bash, The Hundred, PSL, CPL, SA20, ILT20, MLC, and more). @@ -74,6 +82,79 @@ Configured under the `cricket-scoreboard` key in `config/config.json`. See | `background_service` | enabled | Worker/timeout/retry tuning | | `customization` | — | Fonts + colors for score / overs / team / status / detail text | +### Every setting + +The table above groups the ones you are most likely to touch. This is the +complete list, at the exact paths the schema expects — the schema sets +`additionalProperties: false`, so a key at the wrong depth is rejected. + +| Key | Default | Notes | +|---|---|---| +| `enabled` | `false` | Enable or disable the cricket scoreboard plugin. | +| `favorite_teams` | *(empty)* | Favorite national teams. Any international series (tour, World Cup, bilateral) featuring one of these teams is discovered and shown. Matches on team name appearing in the series/match name. | +| `favorite_competitions` | `["international", "ipl", "bbl"]` | Domestic competitions (keys from competitions.json) to follow. Include 'international' to follow Test/ODI/T20I tours for your favorite_teams. | +| `exclude_teams` | *(empty)* | Teams to always hide from live rotation and recent/final scores (spoiler protection). Takes precedence over favorite_teams. | +| `show_favorite_teams_only` | `false` | Only show matches involving a favorite national team. Domestic-league matches are always governed by favorite_competitions. | +| `display_duration` | `15` | Duration in seconds to display each match (5–60). | +| `live_game_duration` | `20` | Duration in seconds to display each live match before rotating to the next (10–120). | +| `non_favorite_live_game_duration` | `0` | Duration in seconds for live matches that do NOT involve a favorite team. 0 (default) = use live_game_duration for every live match (0–120). | +| `recent_game_duration` | `15` | Duration in seconds to display each recent match (5–60). | +| `upcoming_game_duration` | `15` | Duration in seconds to display each upcoming match (5–60). | +| `update_interval_seconds` | `3600` | How often to fetch new match data (seconds) (30–86400). | +| `live_update_interval` | `30` | Update interval for live matches (seconds) (10–300). | +| `recent_update_interval` | `3600` | Update interval for recent matches (seconds) (60–86400). | +| `upcoming_update_interval` | `3600` | Update interval for upcoming matches (seconds) (60–86400). | +| `series_discovery_interval` | `86400` | How often to re-resolve numeric ESPN series IDs from the header endpoint (seconds). Series IDs change per tour/season, so they are re-discovered periodically rather than hardcoded. Default 24h (3600–604800). | +| `recent_games_to_show` | `5` | Maximum number of recent (completed) matches to show (1–20). | +| `upcoming_games_to_show` | `5` | Maximum number of upcoming (scheduled) matches to show (1–20). | +| `live_priority` | `true` | Give live matches priority over other modes. Live matches interrupt normal rotation and are displayed immediately when available. | +| `show_records` | `false` | Show team records (played-won) when available. | +| `show_venue` | `true` | Show the venue/ground on upcoming match cards. | +| `celebration_enabled` | `true` | Show a celebratory takeover screen when a favorite team wins a live match. | +| `celebration_duration` | `8` | How long the win celebration stays on screen (seconds) (3–30). | +| `dynamic_duration.enabled` | `false` | Enable dynamic duration (total_matches x per_match_duration). | +| `dynamic_duration.min_duration_seconds` | `30` | Minimum total duration in seconds for a mode, even if few matches are available (10–300). | +| `dynamic_duration.max_duration_seconds` | `300` | Maximum total duration in seconds for a mode (60–600). | +| `mode_durations.live_mode_duration` | — | Total duration in seconds for Live mode before rotating to next mode. Default: null (dynamic) (10–600). | +| `mode_durations.recent_mode_duration` | — | Total duration in seconds for Recent mode before rotating to next mode. Default: null (dynamic) (10–600). | +| `mode_durations.upcoming_mode_duration` | — | Total duration in seconds for Upcoming mode before rotating to next mode. Default: null (dynamic) (10–600). | +| `display_modes.live` | `true` | Show live matches. | +| `display_modes.recent` | `true` | Show recently completed matches. | +| `display_modes.upcoming` | `true` | Show upcoming matches. | +| `background_service.enabled` | `true` | Enable background service for data fetching. | +| `background_service.max_workers` | `3` | Maximum number of worker threads (1–10). | +| `background_service.request_timeout` | `30` | Request timeout in seconds (5–120). | +| `background_service.max_retries` | `3` | Maximum number of retries for failed requests (1–10). | +| `background_service.priority` | `2` | Background service priority (1–5). | +| `customization.score_text.font` | `"PressStart2P-Regular.ttf"` | one of `PressStart2P-Regular.ttf`, `4x6-font.ttf`, `5by7.regular.ttf`. | +| `customization.score_text.font_size` | `10` | (4–16). | +| `customization.period_text.font` | `"PressStart2P-Regular.ttf"` | one of `PressStart2P-Regular.ttf`, `4x6-font.ttf`, `5by7.regular.ttf`. | +| `customization.period_text.font_size` | `8` | (4–16). | +| `customization.team_name.font` | `"PressStart2P-Regular.ttf"` | one of `PressStart2P-Regular.ttf`, `4x6-font.ttf`, `5by7.regular.ttf`. | +| `customization.team_name.font_size` | `8` | (4–16). | +| `customization.status_text.font` | `"4x6-font.ttf"` | one of `PressStart2P-Regular.ttf`, `4x6-font.ttf`, `5by7.regular.ttf`. | +| `customization.status_text.font_size` | `6` | (4–16). | +| `customization.detail_text.font` | `"4x6-font.ttf"` | one of `PressStart2P-Regular.ttf`, `4x6-font.ttf`, `5by7.regular.ttf`. | +| `customization.detail_text.font_size` | `6` | (4–16). | +| `customization.colors.score_color` | `"#FFFFFF"` | Color for the runs/wickets score. | +| `customization.colors.batting_color` | `"#00FF66"` | Highlight color for the team currently batting. | +| `customization.colors.detail_color` | `"#FFD200"` | Color for run rate / target detail text. | +| `customization.colors.status_color` | `"#AAAAAA"` | Color for status / result text. | + +`mode_durations.*` is read through a key built at runtime — +`f"{mode}_mode_duration"` — so it does not show up in a plain search for the +key name, but it is live: set one to cap that mode's total time on screen, +or leave it `null` to use the per-match durations instead. + + +### What each mode looks like + +![The three display modes](../../docs/assets/cricket-scoreboard/display-modes.png) + +![show_venue on and off](../../docs/assets/cricket-scoreboard/show-venue.png) + +![The same match on four panel sizes](../../docs/assets/cricket-scoreboard/panel-sizes.png) + ## Logos and flags - **Franchise** teams (IPL/BBL/etc.) auto-download their logo from ESPN diff --git a/plugins/cricket-scoreboard/manifest.json b/plugins/cricket-scoreboard/manifest.json index b0caaaef..9ff1255e 100644 --- a/plugins/cricket-scoreboard/manifest.json +++ b/plugins/cricket-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "cricket-scoreboard", "name": "Cricket Scoreboard", - "version": "1.1.1", + "version": "1.1.2", "author": "ChuckBuilds", "description": "Live, recent, and upcoming cricket matches across international tours (Test/ODI/T20I) and major domestic T20 leagues including the IPL, Big Bash League, The Hundred, PSL, CPL, SA20 and more. Shows runs/wickets/overs, run rates, targets, and match results.", "category": "sports", @@ -22,6 +22,12 @@ "cricket_upcoming" ], "versions": [ + { + "version": "1.1.2", + "released": "2026-09-03", + "notes": "Documentation. The configuration table summarised the settings in groups, which left 31 of the 50 without a named key -- every customization font and colour, the background_service tuning, the per-mode duration overrides and the display_modes toggles. The README now carries the full list at the exact paths the schema expects, alongside the existing overview. Adds real rendered screenshots of all three display modes, the show_venue toggle and four panel sizes. Records that mode_durations is read through a key built at runtime, so it does not appear in a search for the key name but is live.", + "ledmatrix_min_version": "2.0.0" + }, { "version": "1.1.1", "released": "2026-08-12", @@ -65,7 +71,7 @@ "ledmatrix_min": "2.0.0" } ], - "last_updated": "2026-07-17", + "last_updated": "2026-09-03", "stars": 0, "downloads": 0, "verified": true,