diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..159dff7f --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,35 @@ + + +## This issue is a + +- [ ] Bug Report +- [ ] Feature Request + + + +## Hardware Configuration + +- Raspberry Pi Revision (4B+/3B+/Zero/etc.): +- Operating System: +- Matrix size: +- Display adapter (HAT/Bonnet/etc.): + - Additional information: +- Power source(s): + + + +## Software Configuration + + + +- MLB LED Scoreboard Version: +- Commands/arguments used to start the scoreboard: + +## Expected behavior + + +## Actual behavior + + +## Additional Information + diff --git a/README.md b/README.md index 69fd4c43..2a3ca395 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# mlb-led-scoreboard [![Join Slack](https://img.shields.io/badge/slack-join-blue.svg)](https://mlb-led-scoreboard.herokuapp.com/) +# mlb-led-scoreboard +![Current Version](https://img.shields.io/github/v/release/MLB-LED-Scoreboard/MLB-LED-Scoreboard) [![Join Slack](https://img.shields.io/badge/slack-join-blue.svg)](https://mlb-led-scoreboard.herokuapp.com/) --------------- @@ -104,6 +105,12 @@ It will also install the following python libraries that are required for certai That should be it! Your latest version should now be working with whatever new fangled features were just added. +#### Version Information + +You can check the version information for your installation of mlb-led-scoreboard by running `python3 version.py`. + +The latest version of the software is available [here](https://github.com/MLB-LED-Scoreboard/mlb-led-scoreboard/releases). + #### Time Zones Make sure your Raspberry Pi's timezone is configured to your local time zone. They'll often have London time on them by default. You can change the timezone of your raspberry pi by running `sudo raspi-config`. @@ -161,6 +168,7 @@ A default `config.json.example` file is included for reference. Copy this file t "time_format" String Sets the preferred hour format for displaying time. Accepted values are "12h" or "24h" depending on which you prefer. "end_of_day" String A 24-hour time you wish to consider the end of the previous day before starting to display the current day's games. Uses local time from your pi. "full_team_names" Bool If true and on a 64-wide board, displays the full team name on the scoreboard instead of their abbreviation. This config option is ignored on 32-wide boards. Defaults to true when on a 64-wide board. +"short_team_names_for_runs_hits" Bool If true and full_team_names is true and Runs Hits Errors is enabled, will use abreviated team names when Runs or Hits > 9 "scrolling_speed" Integer Supports an integer between 0 and 4. Sets how fast the scrolling text scrolls. "debug" Bool Game and other debug data is written to your console. "demo_date" String A date in the format YYYY-MM-DD from which to pull data to demonstrate the scoreboard. A value of `false` will disable demo mode. @@ -169,6 +177,8 @@ A default `config.json.example` file is included for reference. Copy this file t ### Additional Features * Runs/Hits/Errors - Runs are always shown on the games screen, but you can enable or adjust spacing of a "runs, hits, errors" display. Take a look at the [coordinates readme file](/coordinates/README.md) for details. +* Pitch Data - Pitch data can be shown on the game screen, See the [coordinates readme file](/coordinates/README.md) for details. In addition, the Short and Long pitch description can be changed in data/pitches.py + ### Flags You can configure your LED matrix with the same flags used in the [rpi-rgb-led-matrix](https://github.com/hzeller/rpi-rgb-led-matrix) library. More information on these arguments can be found in the library documentation. diff --git a/colors/scoreboard.json.example b/colors/scoreboard.json.example index b7eeb96b..b4d340b5 100644 --- a/colors/scoreboard.json.example +++ b/colors/scoreboard.json.example @@ -114,6 +114,11 @@ "g": 235, "b": 59 }, + "pitch": { + "r": 255, + "g": 255, + "b": 255 + }, "strikeout": { "r": 255, "g": 235, diff --git a/config.json.example b/config.json.example index cd37681b..64acf580 100644 --- a/config.json.example +++ b/config.json.example @@ -42,6 +42,8 @@ "time_format": "12h", "end_of_day": "00:00", "full_team_names": true, + "short_team_names_for_runs_hits": true, + "pregame_weather": true, "scrolling_speed": 2, "debug": false, "demo_date": false diff --git a/coordinates/README.md b/coordinates/README.md index 6672ead3..c500b32f 100644 --- a/coordinates/README.md +++ b/coordinates/README.md @@ -18,6 +18,11 @@ The layout can have a couple of different states where things are rendered diffe * `compress_digits` will reduce the space between digits when the number of runs or hits is > 9. * `spacing` is the number of pixels between the runs/hits and hits/errors. +## Pitch Data +* enabled (true/false) turn feature on/off +* mph (true/false) When rendering pitch speed add mph after (99 mph) +* desc_length (Short/Long) The short or long pitch type description, you can change both the short and long description to your liking in data/pitches as long as you do not change the index value. + ## Updates The software develops and releases features with full support for the default layouts, so custom layouts may look unsatisfactory if you update to later versions of the scoreboard. If you as a user decide to create a custom layout file, you are responsible for tweaking the coordinates to your liking with each update. diff --git a/coordinates/w128h32.json.example b/coordinates/w128h32.json.example index 81bbdf4c..d0aefb87 100644 --- a/coordinates/w128h32.json.example +++ b/coordinates/w128h32.json.example @@ -167,6 +167,15 @@ "y": 30, "width": 40 }, + "pitch": { + "font_name": "4x6", + "x": 1, + "y": 50, + "width": 41, + "enabled": false, + "mph": false, + "desc_length": "Short" + }, "loop": 64, "strikeout": { "x": 84, diff --git a/coordinates/w128h64.json.example b/coordinates/w128h64.json.example index b823ebec..b21d82ee 100644 --- a/coordinates/w128h64.json.example +++ b/coordinates/w128h64.json.example @@ -1,22 +1,22 @@ { "defaults": { - "font_name": "9x18B" + "font_name": "7x13" }, "bases": { "1B": { "x": 112, "y": 42, - "size": 14 + "size": 10 }, "2B": { "x": 103, "y": 33, - "size": 14 + "size": 10 }, "3B": { "x": 94, "y": 42, - "size": 14 + "size": 10 } }, "final": { @@ -46,7 +46,7 @@ }, "due_up": { "due": { - "font_name": "7x13B", + "font_name": "5x7", "x": 38, "y": 44 }, @@ -55,13 +55,13 @@ "y": 56 }, "divider": { - "draw": true, + "draw": false, "x": 36, "y_start": 32, "y_end": 64 }, "leadoff": { - "font_name": "7x13B", + "font_name": "7x13", "x": 64, "y": 42 }, @@ -76,8 +76,8 @@ } }, "number": { - "x": 93, - "y": 45, + "x": 87, + "y": 42, "nohit": { "x": 93, "y": 42 @@ -88,46 +88,55 @@ } }, "arrow": { - "size": 7, + "size": 6, "up": { - "x_offset": -12, - "y_offset": -10 + "x_offset": -11, + "y_offset": -8 }, "down": { - "x_offset": -12, - "y_offset": -2 + "x_offset": -11, + "y_offset": -4 } } }, "outs": { "1": { - "x": 102, - "y": 58, - "size": 4 + "x": 95, + "y": 56, + "size": 5 }, "2": { - "x": 108, - "y": 58, - "size": 4 + "x": 106, + "y": 56, + "size": 5 }, "3": { - "x": 114, - "y": 58, - "size": 4 + "x": 118, + "y": 56, + "size": 5 } }, "atbat": { "batter": { - "font_name": "7x13B", + "font_name": "5x7", "x": 1, "y": 60, "width": 41 }, "pitcher": { - "font_name": "7x13B", + "font_name": "5x7", "x": 1, - "y": 44, - "width": 48 + "y": 40, + "width": 41 + }, + "pitch": { + "font_name": "4x6", + "x": 1, + "y": 50, + "width": 41, + "enabled": true, + "mph": true, + "desc_length": "Long" }, "loop": 68, "strikeout": { @@ -137,7 +146,7 @@ }, "batter_count": { "x": 66, - "y": 60, + "y": 62, "nohit": { "x": 66, "y": 64 @@ -246,27 +255,31 @@ }, "name": { "away": { + "font_name": "9x18B", "x": 4, - "y": 12 + "y": 13 }, "home": { + "font_name": "9x18B", "x": 4, - "y": 28 + "y": 29 } }, "runs": { "runs_hits_errors": { - "show": false, - "compress_digits": false, - "spacing": 3 - }, + "show": true, + "compress_digits": true, + "spacing": 5 + }, "away": { - "x": 120, - "y": 12 + "font_name": "9x18B", + "x": 126, + "y": 13 }, "home": { - "x": 120, - "y": 28 + "font_name": "9x18B", + "x": 126, + "y": 29 } } }, @@ -321,4 +334,4 @@ "y": 31 } } -} \ No newline at end of file +} diff --git a/coordinates/w32h32.json.example b/coordinates/w32h32.json.example index 86401cc7..e4e88529 100644 --- a/coordinates/w32h32.json.example +++ b/coordinates/w32h32.json.example @@ -147,6 +147,15 @@ "y": 33, "width": 12 }, + "pitch": { + "font_name": "4x6", + "x": 1, + "y": 50, + "width": 41, + "enabled": false, + "mph": false, + "desc_length": "Short" + }, "loop": 16, "strikeout": { "x": 33, diff --git a/coordinates/w64h32.json.example b/coordinates/w64h32.json.example index 72574d0b..108819ab 100644 --- a/coordinates/w64h32.json.example +++ b/coordinates/w64h32.json.example @@ -125,6 +125,15 @@ "y": 21, "width": 24 }, + "pitch": { + "font_name": "4x6", + "x": 1, + "y": 50, + "width": 41, + "enabled": false, + "mph": false, + "desc_length": "Short" + }, "loop": 36, "strikeout": { "x": 15, diff --git a/coordinates/w64h64.json.example b/coordinates/w64h64.json.example index f5340894..bb752760 100644 --- a/coordinates/w64h64.json.example +++ b/coordinates/w64h64.json.example @@ -123,6 +123,15 @@ "y": 28, "width": 50 }, + "pitch": { + "font_name": "4x6", + "x": 1, + "y": 50, + "width": 41, + "enabled": false, + "mph": false, + "desc_length": "Short" + }, "loop": 64, "strikeout": { "x": 31, diff --git a/data/config/__init__.py b/data/config/__init__.py index 6c25d2e2..f8db6031 100644 --- a/data/config/__init__.py +++ b/data/config/__init__.py @@ -62,6 +62,8 @@ def __init__(self, filename_base, width, height): self.time_format = json["time_format"] self.end_of_day = json["end_of_day"] self.full_team_names = json["full_team_names"] + self.short_team_names_for_runs_hits = json["short_team_names_for_runs_hits"] + self.pregame_weather = json["pregame_weather"] self.debug = json["debug"] self.demo_date = json["demo_date"] # Make sure the scrolling speed setting is in range so we don't crash diff --git a/data/game.py b/data/game.py index 30b994eb..200a078c 100644 --- a/data/game.py +++ b/data/game.py @@ -9,9 +9,10 @@ API_FIELDS = ( "gameData,game,id,datetime,dateTime,officialDate,flags,noHitter,perfectGame,status,detailedState,abstractGameState," + "reason,probablePitchers,teams,home,away,abbreviation,teamName,players,id,boxscoreName,fullName,liveData,plays," - + "currentPlay,result,eventType,description,decisions,winner,loser,save,id,linescore,outs,balls,strikes,note," - + "inningState,currentInning,currentInningOrdinal,offense,batter,inHole,onDeck,first,second,third,defense,pitcher," - + "boxscore,teams,runs,players,seasonStats,pitching,wins,losses,saves,era,hits,errors" + + "currentPlay,result,eventType,playEvents,isPitch,pitchData,startSpeed,details,type,code,description,decisions," + + "winner,loser,save,id,linescore,outs,balls,strikes,note,inningState,currentInning,currentInningOrdinal,offense," + + "batter,inHole,onDeck,first,second,third,defense,pitcher,boxscore,teams,runs,players,seasonStats,pitching,wins," + + "losses,saves,era,hits,errors,weather,condition,temp,wind" ) SCHEDULE_API_FIELDS = "dates,date,games,status,detailedState,abstractGameState,reason" @@ -66,10 +67,18 @@ def datetime(self): def home_name(self): return self._data["gameData"]["teams"]["home"]["teamName"] - + def home_abbreviation(self): return self._data["gameData"]["teams"]["home"]["abbreviation"] - + + def pregame_weather(self): + try: + wx = self._data["gameData"]["weather"]["condition"] + " and " + self._data["gameData"]["weather"]["temp"] + u"\N{DEGREE SIGN}" + " wind " + self._data["gameData"]["weather"]["wind"] + except KeyError: + return None + else: + return wx + def away_name(self): return self._data["gameData"]["teams"]["away"]["teamName"] @@ -217,6 +226,13 @@ def strikes(self): def outs(self): return self._data["liveData"]["linescore"].get("outs", 0) + def last_pitch(self): + try: + play = self._data["liveData"]["plays"].get("currentPlay", {}).get("playEvents", [{}])[-1] + if play.get("isPitch", False): + return play["pitchData"].get("startSpeed", 0), play["details"]["type"]["code"], play["details"]["type"]["description"] + except: + return None def note(self): try: return self._data["liveData"]["linescore"]["note"] diff --git a/data/pitches.py b/data/pitches.py new file mode 100644 index 00000000..a66606ce --- /dev/null +++ b/data/pitches.py @@ -0,0 +1,47 @@ +#A list of mlb pitch types appearing in statcast +#https://www.daktronics.com/en-us/support/kb/DD3312647 +#Dont change the index, but feel free to change +#the descriptions + +PITCH_LONG = { + "AB": "Automatic Ball", + "AS": "Automatic Strike", + "CH": "Change-up", + "CU": "Curveball", + "EP": "Eephus", + "FC": "Cutter", + "FF": "4 Seam Fastball", #MLB default is "Four-Seam Fastball" + "FO": "Forkball", + "FS": "Splitter", + "FT": "2 Seam Fastball", #MLB default is "Two-Seam Fastball" + "GY": "Gyroball", + "IN": "Intentional Ball", + "KC": "Knuckle Curve", + "KN": "Knuckleball", + "NP": "No Pitch", + "SC": "Screwball", + "SI": "Sinker", + "SL": "Slider", + "UN": "Unknown" +} +PITCH_SHORT = { + "AB": "AB", + "AS": "AS", + "CH": "CH", + "CU": "CU", + "EP": "EP", + "FC": "FC", + "FF": "FF", + "FO": "FO", + "FS": "FS", + "FT": "FT", + "GY": "GY", + "IN": "IN", + "KC": "KC", + "KN": "KN", + "NP": "NP", + "SC": "SC", + "SI": "SI", + "SL": "SL", + "UN": "UN" +} \ No newline at end of file diff --git a/data/scoreboard/pitches.py b/data/scoreboard/pitches.py index cbbe34d9..917f0598 100644 --- a/data/scoreboard/pitches.py +++ b/data/scoreboard/pitches.py @@ -1,7 +1,19 @@ from data.game import Game - +import data.pitches class Pitches: def __init__(self, game: Game): self.balls = game.balls() self.strikes = game.strikes() + last_pitch = game.last_pitch() + if last_pitch is None: + self.last_pitch_speed = "0" + self.last_pitch_type = "UK" + self.last_pitch_type_long = "Unknown" + else: + self.last_pitch_speed = f"{round(last_pitch[0])}" + self.last_pitch_type = data.pitches.PITCH_SHORT[last_pitch[1]] + self.last_pitch_type_long = data.pitches.PITCH_LONG[last_pitch[1]] + + def __str__(self) -> str: + return f"Count: {self.balls} - {self.strikes}. Last pitch: {self.last_pitch_speed}mph {self.last_pitch_type} {self.last_pitch_long}" diff --git a/data/scoreboard/pregame.py b/data/scoreboard/pregame.py index 7ae0e466..121ca767 100644 --- a/data/scoreboard/pregame.py +++ b/data/scoreboard/pregame.py @@ -9,6 +9,7 @@ class Pregame: def __init__(self, game: Game, time_format): self.home_team = game.home_abbreviation() self.away_team = game.away_abbreviation() + self.pregame_weather = game.pregame_weather() self.time_format = time_format try: diff --git a/debug.py b/debug.py index d628bbb5..6c6cc12d 100644 --- a/debug.py +++ b/debug.py @@ -5,6 +5,7 @@ strmhdl = logging.StreamHandler() strmhdl.setFormatter(fmter) logger.addHandler(strmhdl) +logger.propagate = False info = logger.info diff --git a/main.py b/main.py index 51adcc4f..58d372b5 100755 --- a/main.py +++ b/main.py @@ -16,6 +16,7 @@ from data.config import Config from renderers.main import MainRenderer from utils import args, led_matrix_options +from version import SCRIPT_NAME, SCRIPT_VERSION try: from rgbmatrix import RGBMatrix, __version__ @@ -27,10 +28,6 @@ emulated = True -SCRIPT_NAME = "MLB LED Scoreboard" -SCRIPT_VERSION = "5.0.4" - - def main(matrix, config_base): # Read scoreboard options from config.json if it exists diff --git a/renderers/games/game.py b/renderers/games/game.py index 810656a4..411453ef 100644 --- a/renderers/games/game.py +++ b/renderers/games/game.py @@ -28,6 +28,7 @@ def render_live_game(canvas, layout: Layout, colors: Color, scoreboard: Scoreboa scoreboard.strikeout(), scoreboard.strikeout_looking(), (animation_time // 6) % 2, + scoreboard.pitches ) # Check if we're deep enough into a game and it's a no hitter or perfect game @@ -49,8 +50,9 @@ def render_live_game(canvas, layout: Layout, colors: Color, scoreboard: Scoreboa # --------------- at-bat --------------- -def _render_at_bat(canvas, layout, colors, atbat: AtBat, text_pos, strikeout, looking, animation): +def _render_at_bat(canvas, layout, colors, atbat: AtBat, text_pos, strikeout, looking, animation, pitches: Pitches): plength = __render_pitcher_text(canvas, layout, colors, atbat.pitcher, text_pos) + __render_pitch_text(canvas, layout, colors, pitches) if strikeout: if animation: __render_strikeout(canvas, layout, colors, looking) @@ -108,7 +110,24 @@ def __render_pitcher_text(canvas, layout, colors, pitcher, text_pos): graphics.DrawText(canvas, font["font"], coords["x"], coords["y"], color, "P:") return pos - +def __render_pitch_text(canvas, layout, colors, pitches: Pitches): +#def __render_pitch_text(canvas, layout, colors): + coords = layout.coords("atbat.pitch") + color = colors.graphics_color("atbat.pitch") + font = layout.font("atbat.pitch") + bgcolor = colors.graphics_color("default.background") + if(int(pitches.last_pitch_speed) > 0 and layout.coords("atbat.pitch")["enabled"]): + mph= " " + if(layout.coords("atbat.pitch")["mph"]): + mph="mph " + if(layout.coords("atbat.pitch")["desc_length"]=="Long"): + pitch_text = str(pitches.last_pitch_speed) + mph + pitches.last_pitch_type_long + elif(layout.coords("atbat.pitch")["desc_length"]=="Short"): + pitch_text = str(pitches.last_pitch_speed) + mph + pitches.last_pitch_type + else: + pitch_text = None + graphics.DrawText(canvas, font["font"], coords["x"], coords["y"], color, pitch_text) + # --------------- bases --------------- def _render_bases(canvas, layout, colors, bases: Bases, home_run, animation): base_runners = bases.runners diff --git a/renderers/games/pregame.py b/renderers/games/pregame.py index 0613de0f..9f75354b 100644 --- a/renderers/games/pregame.py +++ b/renderers/games/pregame.py @@ -10,8 +10,8 @@ from utils import center_text_position -def render_pregame(canvas, layout: Layout, colors: Color, pregame: Pregame, probable_starter_pos): - text_len = _render_probable_starters(canvas, layout, colors, pregame, probable_starter_pos) +def render_pregame(canvas, layout: Layout, colors: Color, pregame: Pregame, probable_starter_pos, pregame_weather): + text_len = _render_probable_starters(canvas, layout, colors, pregame, probable_starter_pos, pregame_weather) if layout.state_is_warmup(): _render_warmup(canvas, layout, colors, pregame) @@ -39,12 +39,15 @@ def _render_warmup(canvas, layout, colors, pregame): graphics.DrawText(canvas, font["font"], warmup_x, coords["y"], color, warmup_text) -def _render_probable_starters(canvas, layout, colors, pregame, probable_starter_pos): +def _render_probable_starters(canvas, layout, colors, pregame, probable_starter_pos, pregame_weather): coords = layout.coords("pregame.scrolling_text") font = layout.font("pregame.scrolling_text") color = colors.graphics_color("pregame.scrolling_text") bgcolor = colors.graphics_color("default.background") - pitchers_text = pregame.away_starter + " vs " + pregame.home_starter + if pregame_weather and pregame.pregame_weather: + pitchers_text = pregame.away_starter + " vs " + pregame.home_starter + " Weather: " + pregame.pregame_weather + else : + pitchers_text = pregame.away_starter + " vs " + pregame.home_starter return scrollingtext.render_text( canvas, coords["x"], coords["y"], coords["width"], font, color, bgcolor, pitchers_text, probable_starter_pos ) diff --git a/renderers/games/teams.py b/renderers/games/teams.py index 290a5403..5f595006 100644 --- a/renderers/games/teams.py +++ b/renderers/games/teams.py @@ -3,8 +3,7 @@ except ImportError: from RGBMatrixEmulator import graphics - -def render_team_banner(canvas, layout, team_colors, home_team, away_team, full_team_names): +def render_team_banner(canvas, layout, team_colors, home_team, away_team, full_team_names, short_team_names_for_runs_hits): default_colors = team_colors.color("default") away_colors = __team_colors(team_colors, away_team.abbrev) @@ -53,8 +52,10 @@ def render_team_banner(canvas, layout, team_colors, home_team, away_team, full_t y_offset = accent_coords[team]["y"] canvas.SetPixel(x + x_offset, y + y_offset, color["r"], color["g"], color["b"]) - __render_team_text(canvas, layout, away_colors, away_team, "away", full_team_names, default_colors) - __render_team_text(canvas, layout, home_colors, home_team, "home", full_team_names, default_colors) + use_full_team_names = can_use_full_team_names(canvas, full_team_names, short_team_names_for_runs_hits, [home_team, away_team]) + + __render_team_text(canvas, layout, away_colors, away_team, "away", use_full_team_names, default_colors) + __render_team_text(canvas, layout, home_colors, home_team, "home", use_full_team_names, default_colors) # Number of characters in each score. score_spacing = { @@ -65,6 +66,27 @@ def render_team_banner(canvas, layout, team_colors, home_team, away_team, full_t __render_team_score(canvas, layout, away_colors, away_team, "away", default_colors, score_spacing) __render_team_score(canvas, layout, home_colors, home_team, "home", default_colors, score_spacing) +def can_use_full_team_names(canvas, enabled, abbreviate_on_overflow, teams): + # Settings enabled and size is able to display it + if enabled and canvas.width > 32: + + # If config enabled for abbreviating if runs or hits takes up an additional column (i.e. 9 -> 10) + if abbreviate_on_overflow: + + # Iterate through the teams to see if we should abbreviate + for team in teams: + if team.runs > 9 or team.hits > 9: + return False + + # Else use full names if no stats column has overflowed + return True + + # If config for abbreviating is not set, use full name + else: + return True + + # Fallback to abbreviated names for all cases + return False def __team_colors(team_colors, team_abbrev): try: @@ -80,11 +102,10 @@ def __render_team_text(canvas, layout, colors, team, homeaway, full_team_names, coords = layout.coords("teams.name.{}".format(homeaway)) font = layout.font("teams.name.{}".format(homeaway)) team_text = "{:3s}".format(team.abbrev.upper()) - if full_team_names and canvas.width > 32: + if full_team_names: team_text = "{:13s}".format(team.name) graphics.DrawText(canvas, font["font"], coords["x"], coords["y"], text_color_graphic, team_text) - def __render_score_component(canvas, layout, colors, homeaway, default_colors, coords, component_val, width_chars): # The coords passed in are the rightmost pixel. font = layout.font(f"teams.runs.{homeaway}") diff --git a/renderers/main.py b/renderers/main.py index 46fb2479..45ec63f7 100644 --- a/renderers/main.py +++ b/renderers/main.py @@ -146,7 +146,6 @@ def __draw_game(self): game = self.data.current_game bgcolor = self.data.config.scoreboard_colors.color("default.background") self.canvas.Fill(bgcolor["r"], bgcolor["g"], bgcolor["b"]) - scoreboard = Scoreboard(game) layout = self.data.config.layout colors = self.data.config.scoreboard_colors @@ -157,12 +156,13 @@ def __draw_game(self): scoreboard.home_team, scoreboard.away_team, self.data.config.full_team_names, + self.data.config.short_team_names_for_runs_hits, ) if status.is_pregame(game.status()): # Draw the pregame information self.__max_scroll_x(layout.coords("pregame.scrolling_text")) pregame = Pregame(game, self.data.config.time_format) - pos = pregamerender.render_pregame(self.canvas, layout, colors, pregame, self.scrolling_text_pos) + pos = pregamerender.render_pregame(self.canvas, layout, colors, pregame, self.scrolling_text_pos, self.data.config.pregame_weather) self.__update_scrolling_text_pos(pos, self.canvas.width) elif status.is_complete(game.status()): # Draw the game summary diff --git a/version.py b/version.py new file mode 100644 index 00000000..1322e7b0 --- /dev/null +++ b/version.py @@ -0,0 +1,6 @@ +SCRIPT_NAME = "MLB LED Scoreboard" +SCRIPT_VERSION = "5.0.4" + + +if __name__ == "__main__": + print(f"{SCRIPT_NAME} v{SCRIPT_VERSION}")