Keep up to date on the travails of the Mets without needing an MLB TV subscription

Cross posted from mojego bloga pod adresem https://writingontablets.com/Getting-Alerts-For-MLB-Condensed-Games

30 lat temu spędziłem kilka wakacji pracując w New Jersey, i zostałem wciągnięty w szalony świat baseballu New York Mets.

Wtedy, utrzymanie kontaktu po powrocie do domu oznaczało przeszukiwanie International Herald Tribune w poszukiwaniu wiadomości o baseballu, ale przez ostatnią dekadę byłem abonentem MLB TV, która była fantastyczna.

Rozważając odnowienie tegorocznej subskrypcji, zdałem sobie sprawę, że prawie nie oglądam już żadnych gier na żywo. Większość meczów jest rozgrywana wieczorem czasu wschodniego USA lub później, więc to, co zwykle robię, to czekam do następnego ranka i staram się oglądać skondensowaną grę – około 5 minut w stylu „Match Of The Day” – bez znajomości wyniku.

MLB są o wiele mniej cenne z ich pakietów najważniejszych wydarzeń niż Premier League (niespodzianka, niespodzianka!) i udostępniają wiele treści za darmo zarówno na YouTube, jak i w aplikacji MLB TV za darmo.

Jednakże w aplikacji MLB TV nie można uzyskać powiadomień, gdy nowe skondensowane gry są dostępne bez płatnej subskrypcji (co jest wystarczająco sprawiedliwe!), i to jest naprawdę trudne do sprawdzenia, kiedy wideo jest gotowy bez znalezienia wyniku, lub niektóre informacje o grze poprzez inne filmy już opublikowane.

Jednakże doskonały Baseball Theater zorientował się, że konfiguracja dla aplikacji mobilnych odbywa się w sposób otwarty, więc to podsunęło mi pomysł zhakowania razem podobnego rozwiązania, aby wysyłać powiadomienia, gdy tylko nowa skondensowana gra będzie gotowa do oglądania.

Mój system powiadomień o skondensowanych grach MLB

To wszystko jest trochę Heath-Robinson, ale mój system działa jak poniżej. Uwaga, kod jest dostępny na GitHubie, a poniższy fragment jest skopiowany z readme.md z repo:

Istnieją 2 główne punkty wejścia – zaprojektowane do uruchomienia z AWS Lambda:

  1. lambdaCondensedGame,js – Sprawdza, czy strumień skondensowanych gier jest dostępny dla danej drużyny w danym dniu
  2. lambdaMonitor.js – Sprawdza, czy skondensowana gra została dodana, a jeśli tak, wysyła wiadomość na Slack mówiącą, że nowa gra jest gotowa, plus link do strumienia

Funkcja skondensowanej gry

Ta funkcja odczytuje z POSTed JSON sformatowany jak:

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

Musisz również wysłać nagłówek HTTP MLBAPIRequest z wartością ustawioną jako zmienna środowiskowa o tej samej nazwie.

Wtedy:

  1. Buduj URL jak http://gd2.mlb.com/components/game/mlb/year_2018/month_06/day_26/master_scoreboard.xml (używając przychodzącej daty)
  2. Poszukaj węzła <game> gdzie home_file_code=”nym” lub away_file_code=”nym” (używając przychodzącej drużyny)
  3. Podnieś atrybut game_pk aby uzyskać URL np.np. „https://statsapi.mlb.com/api/v1/game/530594/content?language=en”
  4. Znajdź w węzłach media.epgAlternate sekcję „Extended Highlights”, a następnie znajdź element, który jest skondensowanym wideo z meczu (jeśli istnieje)
  5. Wybierz właściwy węzeł URL – wideo, które ma wartość kończącą się na .mp4

Zakładając, że skondensowana gra została znaleziona, funkcja następnie zwraca JSON jak:

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

Uwaga:

  • Atrybut opponent może być zerowy, jeśli nie znaleziono żadnej gry
  • Atrybut url może być zerowy, jeśli nie znaleziono żadnego skondensowanego strumienia gry dla gry
  • Atrybut Atrybut mediaType może być null lub „Extended Highlights” (eksperymentowałem z otrzymywaniem „Recap” przez jakiś czas)

Konfiguracja – Zmienne środowiskowe

  • MLBAPIRequest: Wartość, która ma być wysyłana w nagłówku każdego żądania

Funkcja monitorująca

Ta funkcja zapisuje ostatnio znalezione dane gry w wiadrze S3, a następnie jest przeznaczona do uruchamiania według harmonogramu, aby wykonać następujące czynności:

  • Sprawdza datę w zapisanych danych gry JSON z ostatniego udanego uruchomienia
  • Jeśli data jest dzisiejsza, to skończyliśmy (nie radzimy sobie jeszcze z podwójnymi nagłówkami!)
  • W przeciwnym razie, wywołaj funkcję skondensowanej gry dla dnia wczorajszego lub dzisiejszego (jeśli ostatnia gra była wczoraj), i jeśli wynik ma atrybut url
  • Zapisz najnowsze dane gry JSON do S3
  • Zadzwoń do Slacka wysyłając atrybut url w wiadomości
  • Zadzwoń do haka internetowego IFTTT, który wysyła powiadomienie na iOS, którego kliknięcie otwiera URL viedo

Możesz skonfigurować harmonogram w Cloudwatch, aby uruchamiał się co N minut.

Konfiguracja – Zmienne środowiskowe

  • S3ACCESSKEYID: Access Key dla wiadra S3 do zapisywania danych gry
  • S3DATABUCKET: Nazwa wiadra S3 do zapisywania danych gry
  • S3DATAFILE: Nazwa pliku do zapisywania danych gry w
  • S3SECRETACCESSKEY: Access Secret dla wiadra S3 do zapisywania danych gry
  • SLACK_WEBHOOK_URL: URL webhooka do wysłania wiadomości Slack
  • TEAM: Skrót zespołu do monitorowania np. nym
  • IFTTT_EVENT_NAME: Nazwa zdarzenia IFTTT, aby wysłać połączenie powiadomienia do
  • IFTTT_MAKER_KEY: Nazwa klucza twórcy IFTTT, aby włączyć połączenia IFTTT

Podsumowanie

Wszystko działa naprawdę dobrze do tej pory i dostaję dokładnie to, czego potrzebuję. Bardzo zadowolony! Mogę nadal subskrybować MLB TV w dalszej części sezonu, jeśli brakuje mi weekendowych gier na żywo – lub rzeczywiście, jeśli Metsi dostaną się do wyścigu o playoffy – ale na razie mogę kontynuować wtaching najważniejszych wydarzeń bez tego.

„API” MLB było trochę w rozsypce przez pierwsze kilka tygodni sezonu. Nie jest to publiczne API, więc można się tego spodziewać, ale mam nadzieję, że będzie stabilne przez jakiś czas.

Zbudowałem również skrót do iOS, aby wywołać API bezpośrednio, więc jeśli z jakiegoś powodu adres URL wideo się zmienił, lub przegapiłem/usunąłem powiadomienie przez przypadek.

Jeśli chcesz ustawić coś podobnego dla siebie, a instrukcje GitHub nie są jasne, daj mi znać, a postaram się pomóc!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.