Håll dig uppdaterad om Mets’ vedermödor utan att behöva en MLB TV-prenumeration

Cross posted från min blogg på https://writingontablets.com/Getting-Alerts-For-MLB-Condensed-Games

För 30 år sedan tillbringade jag ett par somrar med att arbeta i New Jersey, och drogs in i New York Mets basebolls galna värld.

På den tiden innebar det att hålla kontakten när man var hemma att man letade i International Herald Tribune efter baseballnyheter, men de senaste tio åren har jag prenumererat på MLB TV, vilket har varit fantastiskt.

När jag funderade på att förnya årets prenumeration insåg jag att jag knappt tittar på några direktsända matcher längre. De flesta matcher spelas på kvällen amerikansk östkusttid eller senare, så vad jag brukar göra är att vänta till nästa morgon och försöka titta på den komprimerade matchen – cirka 5 minuter av höjdpunkter i stil med ”Match Of The Day” – utan att känna till resultatet.

MLB är mycket mindre värdefulla med sina höjdpunktspaket än Premier League (överraskning, överraskning!), och gör mycket innehåll tillgängligt gratis på både YouTubeoch i MLB TV-appen gratis.

I MLB TV-appen kan du dock inte få meddelanden om när nya komprimerade matcher finns tillgängliga utan en betald prenumeration (vilket är rättvist nog!), och det är verkligen svårt att kontrollera när en video är klar utan att ta reda på poängen eller någon information om matchen via de andra videor som redan publicerats.

Det utmärkta Baseball Theater hade dock listat ut att konfigurationen för mobilapparna hålls öppen, så det gav mig idén att hacka ihop en liknande lösning för att skicka varningar så fort det finns en ny kondenserad match är klar för visning.

Mitt varningssystem för MLB Condensed Games

Det hela är lite Heath-Robinson, men mitt system fungerar enligt nedan. Observera att koden är tillgänglig på GitHub, och nedanstående är kopierat från readme.md i repo:

Det finns 2 huvudsakliga ingångspunkter – utformade för att köras från AWS Lambda:

  1. lambdaCondensedGame,js – Kontrollerar om en stream för kondenserade matcher är tillgänglig för ett visst lag på en viss dag
  2. lambdaMonitor.js – Kontrollerar om ett kondenserat spel har lagts till och skickar i så fall ett Slack-meddelande om att ett nytt spel är klart samt en länk till strömmen

Condensed Game-funktionen

Denna funktion läser från det POSTade JSON-meddelandet som är formaterat på följande sätt:

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

Du måste också skicka en HTTP-huvudrubrik MLBAPIRequest med ett värde som är inställt som en miljövariabel med samma namn.

Detta kommer sedan att:

  1. Skapa URL som http://gd2.mlb.com/components/game/mlb/year_2018/month_06/day_26/master_scoreboard.xml (med hjälp av det inkommande datumet)
  2. Leta efter noden <game> där home_file_code=”nym” eller away_file_code=”nym” (med hjälp av det inkommande laget)
  3. Sök efter game_pk-attributet för att få URL e.t.ex. ”https://statsapi.mlb.com/api/v1/game/530594/content?language=en”
  4. Sök i noderna media.epgAlternate efter avsnittet ”Extended Highlights” och leta sedan efter det objekt som är den komprimerade spelvideon (om den finns)
  5. Välj rätt URL-nod – videon som har ett värde som slutar på .mp4

Antagen att ett kondenserat spel hittas, returnerar funktionen sedan JSON som:

{
"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:

  • Attributet opponent kan vara ogiltigt om inget spel har hittats
  • Attributet url kan vara ogiltigt om inget kondenserat spelflöde har hittats för spelet
  • Attributet url kan vara ogiltigt om inget kondenserat spelflöde har hittats för spelet
  • Den mediaType kan vara noll eller ”Extended Highlights” (jag experimenterade med att även få ”Recap” ett tag)

Konfiguration – Miljövariabler

  • MLBAPIRequest: Den här funktionen sparar de senast funna speldata i en S3-hink och är sedan utformad för att köras enligt ett schema för att göra följande:
    • Kollar på datum i sparade speldata JSON från den senaste lyckade körningen
    • Om datumet är i dag är vi klara (vi klarar inte av dubbla huvudmatcher än!)
    • I annat fall anropar du funktionen för det komprimerade spelet för antingen igår eller idag (om det senaste spelet var igår), och om resultatet har ett url-attribut
    • Spara den senaste matchdatan JSON till S3
    • Kalla Slack och skicka url-attributet i ett meddelande
    • Kalla en IFTTT-webbkrok som skickar ett iOS-meddelande och om du klickar på det öppnas viedo-url:en

    Du kan ställa in ett schema i Cloudwatch så att det körs var N minut.

    Konfiguration – Miljövariabler

    • S3ACCESSKEYID: Access Key for the S3 bucket to save game data
    • S3DATABUCKET: Name of the S3 bucket to save game data
    • S3DATAFILE: Name of the file to save game data in
    • S3SECRETACCESSKEY: Åtkomsthemlighet för S3-hinken för att spara speldata
    • SLACK_WEBHOOK_URL: URL för den webhook som Slack-meddelandet ska skickas till
    • TEAM: Lagförkortning som ska övervakas, t.ex. nym
    • IFTTT_EVENT_NAME: Namnet på IFTTT-händelsen för att skicka anmälningssamtalet till
    • IFTTT_MAKER_KEY: Namnet på IFTTT maker-nyckeln för att aktivera IFTTT-samtalen

    Sammanfattning

    Allt fungerar riktigt bra hittills och jag får precis vad jag behöver. Mycket nöjd! Jag kan fortfarande prenumerera på MLB TV senare under säsongen om jag missar helgens direktsända matcher – eller om Mets hamnar i ett slutspel – men för tillfället kan jag fortsätta att titta på höjdpunkterna utan det.

    MLB:s ”API” var lite i förändring under de första veckorna av säsongen. Det är inte ett offentligt API så det är väntat, men förhoppningsvis kommer det att vara stabilt ett tag nu.

    Jag byggde också en iOS-genväg för att anropa API:et direkt, så om video-URL:en av någon anledning ändrades, eller om jag missade/släckte meddelandet av misstag.

    Om du vill sätta upp något liknande för dig själv och GitHub-instruktionerna är otydliga, säg till mig så ska jag försöka hjälpa dig!

Lämna ett svar

Din e-postadress kommer inte publiceras.