Hold dig opdateret på Mets’ problemer uden at skulle have et MLB TV-abonnement

Tværsendt fra min blog på https://writingontablets.com/Getting-Alerts-For-MLB-Condensed-Games

For 30 år siden tilbragte jeg et par somre med at arbejde i New Jersey, og blev draget ind i den skøre verden af New York Mets baseball.

Dengang betød det at holde kontakten, når man var hjemme, at man skulle gennemsøge International Herald Tribune for baseballnyheder, men i det sidste årti har jeg været abonnent på MLB TV, hvilket har været fantastisk.

Da jeg overvejede at forny dette års abonnement, gik det op for mig, at jeg næsten ikke ser nogen livekampe mere. De fleste kampe spilles om aftenen amerikansk østlig tid eller senere, så det, jeg normalt gør, er at vente til næste morgen og forsøge at se den kondenserede kamp – omkring 5 minutter af “Match Of The Day”-agtige højdepunkter – uden at kende resultatet.

MLB er meget mindre kostbare med deres højdepunktspakker end Premier League (overraskelse, overraskelse!), og gør en masse indhold gratis tilgængeligt på både YouTubeog i MLB TV-appen gratis.

I MLB TV-appen kan man dog ikke få notifikationer om, hvornår nye kondenserede kampe er tilgængelige uden et betalt abonnement (hvilket er fair nok!), og det er virkelig svært at tjekke, hvornår en video er klar uden at finde ud af resultatet eller nogle oplysninger om kampen via de andre videoer, der allerede er offentliggjort.

Den fremragende Baseball Theater havde imidlertid fundet ud af, at konfigurationen til mobilapps holdes åbent, så det gav mig ideen til at hacke en lignende løsning sammen, der kan sende alarmer, så snart der er en ny kondenseret kamp er klar til visning.

Min MLB Condensed Games alert system

Det hele er lidt Heath-Robinson, men mit system fungerer som nedenstående. Bemærk koden er al avaialble på GitHub, og nedenstående er kopieret fra readme.md i repo’en:

Der er 2 hovedindgangspunkter – designet til at blive kørt fra AWS Lambda:

  1. lambdaCondensedGame,js – Kontrollerer, om en kondenseret spilstream er tilgængelig for et givet hold på en given dag
  2. lambdaMonitor.js – Vil se, om der er blevet tilføjet et kondenseret spil, og sender i så fald en Slack-besked om, at et nyt spil er klar, plus et link til strømmen

Condensed Game-funktion

Denne funktion læser fra den POSTede JSON formateret som:

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

Du skal også sende en HTTP-header på MLBAPIRequest med en værdi indstillet som en miljøvariabel med samme navn.

Dette vil så:

  1. Byg URL op som http://gd2.mlb.com/components/game/mlb/year_2018/month_06/day_26/master_scoreboard.xml (ved hjælp af den indgående dato)
  2. Læs efter <game> node hvor home_file_code=”nym” eller away_file_code=”nym” (ved hjælp af det indgående hold)
  3. Søg efter game_pk-attributten for at få URL e.f.eks. “https://statsapi.mlb.com/api/v1/game/530594/content?language=en”
  4. Find i media.epgAlternate-noderne afsnittet “Extended Highlights”, og find derefter det element, der er den kondenserede spilvideo (hvis den findes)
  5. Vælg den korrekte URL-node – den video, der har en værdi, der ender på .mp4

Antaget at et kondenseret spil er fundet, returnerer funktionen derefter 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:

  • Attributten opponent kan være nul, hvis der ikke er fundet noget spil
  • Attributten url kan være nul, hvis der ikke er fundet nogen kondenseret spilstrøm for spillet
  • Attributten url kan være nul, hvis der ikke er fundet nogen kondenseret spilstrøm for spillet
  • Den mediaType-attributten kan være nul eller “Extended Highlights” (jeg eksperimenterede med også at få “Recap” i et stykke tid)

Konfiguration – Miljøvariabler

  • MLBAPIRequest: Denne funktion gemmer de senest fundne spildata i en S3-spand og er derefter designet til at køre efter en tidsplan for at gøre følgende:
    • Kigger på dato i gemte spildata JSON fra den sidste vellykkede kørsel
    • Hvis dato er i dag, er vi færdige (vi klarer ikke dobbelt-headers endnu!)
    • I modsat fald skal du kalde den kondenserede spilfunktion for enten i går eller i dag (hvis det sidste spil var i går), og hvis resultatet har en url-attribut
    • Sparer de seneste spildata JSON til S3
    • Kald Slack og send url-attributten i en mesage
    • Kald en IFTTT-webhook, der sender en iOS-meddelelse, hvor der ved at klikke på åbnes viedo-URL

    Du kan opsætte en tidsplan i Cloudwatch til at køre hvert N minut.

    Konfiguration – Miljøvariabler

    • S3ACCESSKEYID: Adgangsnøgle til S3-spanden til at gemme spildata
    • S3DATABUCKET: Navn på S3-spanden til at gemme spildata
    • S3DATAFILE: Navn på filen til at gemme spildata i
    • S3SECRETACCESSKEY: Adgangshemmelighed for S3-spanden til lagring af spildata
    • SLACK_WEBHOOK_URL: Adgangshemmelighed for S3-spanden til lagring af spildata
    • SLACK_WEBHOOK_URL: URL for den webhook, der skal sende Slack-beskeden til
    • TEAM: Teamforkortelse til overvågning, f.eks. nym
    • IFTTT_EVENT_NAME: Navn på IFTTT-hændelsen til at sende meddelelsesopkaldet til
    • IFTTT_MAKER_KEY: Navn på IFTTT-maker-nøglen til at aktivere IFTTT-opkald

    Summary

    Alt fungerer rigtig godt indtil videre, og jeg får præcis det, jeg har brug for. Meget tilfreds! Jeg kan stadig abonnere på MLB TV senere på sæsonen, hvis jeg går glip af weekendens livekampe – eller faktisk hvis Mets kommer ind i et playoff-løb – men for nu kan jeg fortsætte med at wtaching højdepunkterne uden det.

    MLB “API” var en smule i bevægelse i de første par uger af sæsonen. Det er ikke et offentligt API, så det er forventeligt, men forhåbentlig vil det være stabilt i et stykke tid nu.

    Jeg byggede også en iOS-genvej til at kalde API’et direkte, så hvis videoens URL af en eller anden grund ændrede sig, eller jeg ved et uheld overså/slettede meddelelsen.

    Hvis du ønsker at sætte noget lignende op for dig selv, og GitHub-vejledningen ikke er klar, så lad mig vide det, og jeg vil forsøge at hjælpe dig!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.