Blijf op de hoogte van de wederwaardigheden van de Mets zonder dat u een MLB TV-abonnement nodig hebt

Cross posted from mijn blog op https://writingontablets.com/Getting-Alerts-For-MLB-Condensed-Games

30 jaar geleden bracht ik een paar zomers door in New Jersey, en werd ik meegesleurd in de gekke wereld van het New York Mets honkbal.

In die tijd moest ik voor honkbalnieuws de International Herald Tribune doorspitten om op de hoogte te blijven, maar de laatste tien jaar ben ik geabonneerd op MLB TV en dat is fantastisch.

Toen ik overwoog om het abonnement dit jaar te verlengen, realiseerde ik me dat ik nauwelijks nog live-wedstrijden kijk. De meeste wedstrijden worden ’s avonds gespeeld US Eastern Time of later, dus wat ik meestal doe is wachten tot de volgende ochtend en proberen om de gecondenseerde spel te kijken – ongeveer 5 minuten van “Match Of The Day” stijl hoogtepunten – zonder te weten de score.

MLB zijn een stuk minder kostbaar met hun hoogtepunten pakketten dan de Premier League (verrassing, verrassing!), en maken veel inhoud gratis beschikbaar op zowel YouTube en binnen de MLB TV-app gratis.

Hoewel binnen de MLB TV-app kun je geen meldingen krijgen voor wanneer nieuwe gecondenseerde wedstrijden beschikbaar zijn zonder een betaald abonnement (wat eerlijk genoeg is!), en het is echt moeilijk om te controleren wanneer een de video klaar is zonder het vinden van de score, of enige informatie over de wedstrijd via de andere video’s al gepubliceerd.

Het uitstekende Baseball Theater had echter uitgezocht dat de configuratie voor de mobiele apps in de openbaarheid wordt gehouden, dus dat bracht me op het idee om een soortgelijke oplossing in elkaar te hacken om waarschuwingen te versturen zodra er een nieuwe gecondenseerde wedstrijd klaar is om te bekijken.

Mijn MLB Condensed Games waarschuwingssysteem

Het is allemaal een beetje Heath-Robinson, maar mijn systeem werkt zoals hieronder. Merk op dat de code allemaal beschikbaar is op GitHub, en het onderstaande is gekopieerd uit de readme.md van de repo:

Er zijn 2 belangrijke ingangspunten – ontworpen om te worden uitgevoerd vanuit AWS Lambda:

  1. lambdaCondensedGame,js – Controleert of een gecondenseerde gamestream beschikbaar is voor een bepaald team op een bepaalde dag
  2. lambdaMonitor.js – Kijkt of er een gecondenseerd spel is toegevoegd, en zo ja stuurt een Slack bericht dat er een nieuw spel klaar is, plus een link naar de stream

Condensed Game functie

Deze functie leest van de gepoSTe JSON geformatteerd als:

{
gameDate: "2019-04-26",
team: "nym"
}

Je moet ook een HTTP header van MLBAPIRequest sturen met een waarde ingesteld als een omgevingsvariabele met dezelfde naam.

Dit zal dan:

  1. Bouw URL zoals http://gd2.mlb.com/components/game/mlb/year_2018/month_06/day_26/master_scoreboard.xml (met behulp van de inkomende datum)
  2. Zoek naar <game> node waar home_file_code=”nym” of away_file_code=”nym” (met behulp van het inkomende team)
  3. Vraag game_pk attribuut om de URL te krijgen bijv.b.v. “https://statsapi.mlb.com/api/v1/game/530594/content?language=en”
  4. Vind in de media.epgAlternate nodes de “Extended Highlights” sectie, en vind dan het item dat de gecondenseerde wedstrijdvideo is (als die bestaat)
  5. Kies de juiste URL node – de video die een waarde heeft die eindigt op .mp4

Aannemend dat een gecondenseerd spel is gevonden, retourneert de functie dan JSON zoals:

{
"opponent": "pit",
"date": "2019-04-26",
"url": "http://mediadownloads.mlb.com/mlbam/mp4/2018/06/27/2202032583/1530076464641/asset_1200K.mp4",
"mediaType": "Extended Highlights"
}

Note:

  • Het opponent attribuut kan null zijn als er geen spel is gevonden
  • Het url attribuut kan null zijn als er geen gecondenseerde spelstroom is gevonden voor het spel
  • Het mediaType attribuut kan null zijn of “Extended Highlights” (ik heb een tijdje geëxperimenteerd met ook de “Recap” te krijgen)

Configuratie – Omgevingsvariabelen

  • MLBAPIRequest: De waarde die in de header van elk verzoek moet worden meegestuurd

Monitoringfunctie

Deze functie slaat de laatst gevonden spelgegevens op in een S3-emmer, en is vervolgens ontworpen om op een schema te draaien om het volgende te doen:

  • Kijkt naar datum in opgeslagen spelgegevens JSON van de laatste succesvolle run
  • Als datum vandaag is, zijn we klaar (we kunnen nog niet omgaan met double-headers!)
  • Anders, roep de verkorte spel functie op voor of gisteren of vandaag (als het laatste spel gisteren was), en als het resultaat een url-attribuut heeft
  • Sla de laatste spelgegevens JSON op naar S3
  • Bel Slack op en stuur het url-attribuut in een bericht
  • Bel een IFTTT-webhaak op die een iOS-melding stuurt, waarop klikken de URL van de viedo opent

U kunt in Cloudwatch een schema instellen om elke N minuten te draaien.

Configuratie – Omgevingsvariabelen

  • S3ACCESSKEYID: Toegangssleutel voor de S3 bucket om spelgegevens in op te slaan
  • S3DATABUCKET: Naam van de S3 bucket om spelgegevens in op te slaan
  • S3DATAFILE: Naam van het bestand om spelgegevens in op te slaan
  • S3SECRETACCESSKEY: Toegangsgeheim voor de S3 emmer om spelgegevens in op te slaan
  • SLACK_WEBHOOK_URL: URL van de webhook om het Slack bericht naar te sturen
  • TEAM: Team afkorting om te monitoren bijv. nym
  • IFTTT_EVENT_NAME: Naam van het IFTTT event om de notificatie oproep naar te sturen
  • IFTTT_MAKER_KEY: Naam van de IFTTT maker key om IFTTT oproepen te activeren

Samenvatting

Alles werkt echt goed tot nu toe, en ik krijg precies wat ik nodig heb. Zeer tevreden! Misschien abonneer ik me later in het seizoen nog op MLB TV als ik de wedstrijden in het weekend mis – of als de Mets in de play-offs komen – maar voorlopig kan ik de hoogtepunten ook zonder MLB TV bekijken.

De MLB “API” was de eerste weken van het seizoen een beetje in beweging. Het is geen openbare API dus dat is te verwachten, maar hopelijk zal het nu een tijdje stabiel zijn.

Ik heb ook een iOS-snelkoppeling gebouwd om de API rechtstreeks aan te roepen, dus als om wat voor reden dan ook de video-URL verandert, of ik de melding per ongeluk heb gemist/verwijderd.

Als je iets soortgelijks voor jezelf wilt opzetten en de GitHub-instructies zijn niet duidelijk, laat het me weten en ik zal proberen je te helpen.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.