Mantieniti aggiornato sui travagli dei Mets senza bisogno di un abbonamento alla MLB TV
Inviato da my blog at https://writingontablets.com/Getting-Alerts-For-MLB-Condensed-Games
30 anni fa ho passato un paio di estati a lavorare nel New Jersey, e sono stato coinvolto nel pazzo mondo del baseball dei New York Mets.
All’epoca, tenersi in contatto quando si tornava a casa significava setacciare l’International Herald Tribune per qualsiasi notizia sul baseball, ma negli ultimi dieci anni sono stato abbonato a MLB TV, che è stato fantastico.
Quando ho pensato di rinnovare l’abbonamento di quest’anno, mi sono reso conto che non guardo quasi più le partite dal vivo. La maggior parte delle partite si giocano la sera, ora della costa orientale degli Stati Uniti o più tardi, quindi quello che generalmente faccio è aspettare fino alla mattina successiva e cercare di guardare il gioco condensato – circa 5 minuti di highlights stile “Match Of The Day” – senza conoscere il punteggio.
La MLB è molto meno preziosa con i suoi pacchetti di highlights rispetto alla Premier League (sorpresa, sorpresa!), e rendono un sacco di contenuti disponibili gratuitamente sia su YouTube che all’interno dell’app MLB TV gratuitamente.
Tuttavia all’interno dell’app MLB TV non è possibile ottenere notifiche per quando sono disponibili nuove partite condensate senza un abbonamento a pagamento (che è abbastanza giusto!), ed è davvero difficile controllare quando un video è pronto senza scoprire il punteggio, o alcune informazioni sulla partita attraverso gli altri video già pubblicati.
Tuttavia, l’eccellente Baseball Theater aveva capito che la configurazione per le applicazioni mobili è tenuta all’aperto, così questo mi ha dato l’idea di mettere insieme una soluzione simile per inviare avvisi non appena una nuova partita condensata è pronta per la visualizzazione.
Il mio sistema di allarme MLB Condensed Games
È tutto un po’ alla Heath-Robinson, ma il mio sistema funziona come segue. Si noti che il codice è tutto disponibile su GitHub, e quanto segue è copiato dal readme.md del repo:
Ci sono 2 punti di ingresso principali – progettato per essere eseguito da AWS Lambda:
- lambdaCondensedGame,js – Controlla se un flusso di gioco condensato è disponibile per una data squadra in un determinato giorno
- lambdaMonitor.js – Controlla se un gioco condensato è stato aggiunto, e se è così invia un messaggio Slack dicendo che un nuovo gioco è pronto, più un link allo stream
Funzione Gioco condensato
Questa funzione legge dal POSTed JSON formattato come:
{
gameDate: "2019-04-26",
team: "nym"
}
È necessario anche inviare un header HTTP di MLBAPIRequest
con un valore impostato come variabile di ambiente con lo stesso nome.
Quindi:
- Costruisci URL come http://gd2.mlb.com/components/game/mlb/year_2018/month_06/day_26/master_scoreboard.xml (usando la data in arrivo)
- Cerca il nodo <game> dove home_file_code=”nym” o away_file_code=”nym” (usando la squadra in arrivo)
- Prendi l’attributo game_pk per ottenere l’URL e.g. “https://statsapi.mlb.com/api/v1/game/530594/content?language=en”
- Trova nei nodi media.epgAlternate la sezione “Extended Highlights”, e poi trova l’elemento che è il video condensato della partita (se esiste)
- Scegli il nodo URL corretto – il video che ha un valore che finisce in .mp4
Assumendo che venga trovato un gioco condensato, la funzione restituisce poi JSON come:
{
"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:
- L’attributo
opponent
può essere nullo se nessun gioco è stato trovato - L’attributo
url
può essere nullo se nessun flusso di gioco condensato è stato trovato per il gioco - Il
mediaType
attributo può essere nullo o “Extended Highlights” (ho sperimentato con l’ottenere anche il “Recap” per un po’)
Configuration – Environment variables
-
MLBAPIRequest
: Il valore da inviare nell’intestazione di ogni richiesta
Funzione di monitoraggio
Questa funzione salva gli ultimi dati di gioco trovati in un bucket S3, e poi è progettata per essere eseguita su un programma per fare quanto segue:
- Guarda la data nei dati di gioco salvati JSON dall’ultima esecuzione riuscita
- Se la data è oggi, abbiamo finito (non facciamo ancora i doppi turni!)
- Altrimenti, chiama la funzione di gioco condensato per ieri o per oggi (se l’ultima partita è stata ieri), e se il risultato ha un attributo url
- Salva i dati dell’ultima partita JSON su S3
- Chiama Slack inviando l’attributo url in un messaggio
- Chiama un hook web IFTTT che invia una notifica iOS, cliccando sulla quale si apre l’URL viedo
Puoi impostare una pianificazione in Cloudwatch per eseguire ogni N minuti.
Configurazione – Variabili d’ambiente
-
S3ACCESSKEYID
: Chiave di accesso per il bucket S3 per salvare i dati di gioco -
S3DATABUCKET
: Nome del bucket S3 per salvare i dati di gioco -
S3DATAFILE
: Nome del file in cui salvare i dati di gioco -
S3SECRETACCESSKEY
: Segreto di accesso per il bucket S3 per salvare i dati di gioco -
SLACK_WEBHOOK_URL
: URL del webhook a cui inviare il messaggio Slack -
TEAM
: Abbreviazione della squadra da monitorare, ad es. nym -
IFTTT_EVENT_NAME
: Nome dell’evento IFTTT a cui inviare la chiamata di notifica -
IFTTT_MAKER_KEY
: Nome della chiave IFTTT maker per abilitare le chiamate IFTTT
Sommario
Tutto funziona molto bene finora, e sto ottenendo esattamente ciò di cui ho bisogno. Molto felice! Potrei ancora abbonarmi a MLB TV più avanti nella stagione se mi sto perdendo le partite dal vivo del fine settimana – o se i Mets entrano in una corsa ai playoff – ma per ora posso continuare a guardare i momenti salienti senza di essa.
L’API MLB era un po’ in movimento per le prime settimane della stagione. Non è un’API pubblica, quindi c’è da aspettarselo, ma si spera che sia stabile per un po’.
Ho anche costruito una scorciatoia per iOS per chiamare direttamente l’API, quindi se per qualche motivo l’URL del video è cambiato, o ho perso/cancellato la notifica per sbaglio.
Se volete impostare qualcosa di simile per voi e le istruzioni di GitHub non sono chiare, fatemelo sapere e cercherò di aiutarvi!