Să fii la curent cu chinurile celor de la Mets fără a avea nevoie de un abonament MLB TV
Cross posted from blogul meu de la https://writingontablets.com/Getting-Alerts-For-MLB-Condensed-Games
Cu 30 de ani în urmă am petrecut câteva veri lucrând în New Jersey, și am fost atras în lumea nebună a baseball-ului New York Mets.
Pe atunci, să ținem legătura când ne întorceam acasă însemna să răscolim International Herald Tribune pentru orice știre despre baseball, dar în ultimul deceniu am fost abonat la MLB TV, ceea ce a fost fantastic.
Când mă gândeam să reînnoiesc abonamentul din acest an, mi-am dat seama că nu mă mai uit aproape deloc la meciuri în direct. Cele mai multe meciuri se joacă seara, ora de est a SUA sau mai târziu, așa că ceea ce fac în general este să aștept până a doua zi dimineața și să încerc să urmăresc meciul condensat – în jur de 5 minute de evidențe în stilul „Match Of The Day” – fără să știu scorul.
MLB sunt mult mai puțin prețioși cu pachetele lor de evidențe decât Premier League (surpriză, surpriză!), și fac o mulțime de conținut disponibil gratuit atât pe YouTube cât și în cadrul aplicației MLB TV gratuit.
Dar în cadrul aplicației MLB TV nu poți primi notificări pentru când sunt disponibile noi meciuri condensate fără un abonament plătit (ceea ce este corect!), și este foarte greu să verifici când un video este gata fără să afli scorul sau unele informații despre meci prin intermediul altor videoclipuri deja publicate.
Cu toate acestea, excelentul Baseball Theater și-a dat seama că configurația pentru aplicațiile mobile este ținută la vedere, așa că asta mi-a dat ideea de a pune la cale o soluție similară pentru a trimite alerte de îndată ce un nou joc condensat este gata de vizionare.
Sistemul meu de alertă pentru jocurile condensate MLB
Este totul un pic Heath-Robinson, dar sistemul meu funcționează ca mai jos. Rețineți că tot codul este disponibil pe GitHub, iar cele de mai jos sunt copiate din readme.md din repo:
Există 2 puncte de intrare principale – concepute pentru a fi rulate din AWS Lambda:
- lambdaCondensedGame,js – Verifică dacă un flux de jocuri condensate este disponibil pentru o anumită echipă într-o anumită zi
- lambdaMonitor.js – Va vedea dacă a fost adăugat un joc condensat și, în caz afirmativ, trimite un mesaj Slack care spune că un nou joc este gata, plus un link către stream
Funcția Joc Condensat
Această funcție citește din JSON-ul postat în format JSON în felul următor:
{
gameDate: "2019-04-26",
team: "nym"
}
De asemenea, trebuie să trimiteți un antet HTTP de MLBAPIRequest
cu o valoare setată ca o variabilă de mediu cu același nume.
Aceasta va face apoi:
- Constituie un URL de genul http://gd2.mlb.com/components/game/mlb/year_2018/month_06/day_26/master_scoreboard.xml (folosind data de intrare)
- Căutați nodul <game> unde home_file_code=”nym” sau away_file_code=”nym” (folosind echipa de intrare)
- Căutați atributul game_pk pentru a obține URL-ul e.g. „https://statsapi.mlb.com/api/v1/game/530594/content?language=en”
- Căutați în nodurile media.epgAlternate secțiunea „Extended Highlights” și apoi găsiți elementul care este videoclipul condensat al meciului (dacă există)
- Căutați nodul URL corect – videoclipul care are o valoare care se termină în .mp4
Să presupunem că se găsește un joc condensat, funcția returnează apoi JSON ca:
{
"opponent": "pit",
"date": "2019-04-26",
"url": "http://mediadownloads.mlb.com/mlbam/mp4/2018/06/27/2202032583/1530076464641/asset_1200K.mp4",
"mediaType": "Extended Highlights"
}
Nota:
- Atributul
opponent
poate fi nul dacă nu a fost găsit nici un joc - Atributul
url
poate fi nul dacă nu a fost găsit nici un flux de joc condensat pentru joc - Atributul
mediaType
atributulmediaType
poate fi nul sau „Extended Highlights” (am experimentat să obțin și „Recapitularea” pentru o vreme)
Configurare – Variabile de mediu
-
MLBAPIRequest
: Valoarea care trebuie trimisă în antetul oricărei cereri
Funcția de monitorizare
Această funcție salvează ultimele date de joc găsite într-un bucket S3, iar apoi este proiectată să ruleze în funcție de un program pentru a face următoarele:
- Se uită la data din JSON-ul datelor de joc salvate de la ultima execuție reușită
- Dacă data este astăzi, am terminat (nu facem față încă la meciurile duble!)
- În caz contrar, se apelează funcția de joc condensat fie pentru ieri, fie pentru astăzi (dacă ultimul joc a fost ieri), și dacă rezultatul are un atribut url
- Salvați cele mai recente date de joc JSON în S3
- Apelează Slack trimițând atributul url într-un mesaj
- Apelează un cârlig web IFTTT care trimite o notificare iOS, făcând clic pe care deschide URL-ul viedo
Puteți configura un program în Cloudwatch pentru a se executa la fiecare N minute.
Configurare – Variabile de mediu
-
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
: Secretul de acces pentru bucket-ul S3 în care se salvează datele jocului -
SLACK_WEBHOOK_URL
: URL-ul webhook-ului la care se trimite mesajul Slack -
TEAM
: Abrevierea echipei de monitorizat, de ex. nym -
IFTTT_EVENT_NAME
: Numele evenimentului IFTTT pentru a trimite apelul de notificare către -
IFTTT_MAKER_KEY
: Numele cheii IFTTT maker pentru a activa apelurile IFTTT
Summary
Toate lucrurile funcționează foarte bine până acum și obțin exact ceea ce am nevoie. Foarte fericit! S-ar putea să mă abonez în continuare la MLB TV mai târziu în sezon, dacă pierd meciurile în direct din weekend – sau, într-adevăr, dacă Mets intră într-o cursă de playoff – dar deocamdată pot continua să wtaching highlight-urile fără ea.
„API” MLB a fost un pic în schimbare în primele câteva săptămâni ale sezonului. Nu este un API public, așa că este de așteptat, dar sperăm că va fi stabil pentru o vreme.
Am construit, de asemenea, o comandă rapidă pentru iOS pentru a apela direct API-ul, astfel încât, dacă dintr-un motiv oarecare, URL-ul video s-a schimbat sau am ratat/șters notificarea din greșeală.
Dacă doriți să configurați ceva similar pentru dvs. și instrucțiunile GitHub nu sunt clare, anunțați-mă și voi încerca să vă ajut!