Mantenerse al día de las peripecias de los Mets sin necesidad de estar suscrito a MLB TV
Cruzado desde mi blog en https://writingontablets.com/Getting-Alerts-For-MLB-Condensed-Games
Hace 30 años pasé un par de veranos trabajando en Nueva Jersey y me metí en el loco mundo del béisbol de los Mets de Nueva York.
En aquel entonces, mantener el contacto cuando volvía a casa significaba buscar en el International Herald Tribune cualquier noticia sobre béisbol, pero durante la última década he estado suscrito a MLB TV, lo cual ha sido fantástico.
Cuando consideré renovar la suscripción de este año, me di cuenta de que ya casi no veo ningún partido en directo. La mayoría de los partidos se juegan por la noche, hora del este de EE.UU., o más tarde, así que lo que suelo hacer es esperar hasta la mañana siguiente e intentar ver el partido condensado -unos 5 minutos de resúmenes del estilo «Match Of The Day»- sin saber el resultado.
La MLB es mucho menos preciada con sus paquetes de resúmenes que la Premier League (¡sorpresa, sorpresa!¡), y hacen una gran cantidad de contenido disponible de forma gratuita tanto en YouTube como dentro de la aplicación MLB TV de forma gratuita.
Sin embargo, dentro de la aplicación MLB TV no se puede obtener notificaciones para cuando los nuevos juegos condensados están disponibles sin una suscripción de pago (que es bastante justo!), y es realmente difícil comprobar cuando un el vídeo está listo sin averiguar la puntuación, o alguna información sobre el juego a través de los otros vídeos ya publicados.
Sin embargo, el excelente Teatro de Béisbol había descubierto que la configuración de las aplicaciones móviles se lleva a cabo en el abierto, por lo que me dio la idea de hackear juntos una solución similar para enviar alertas tan pronto como hay un nuevo juego condensado está listo para su visualización.
Mi sistema de alerta MLB Condensed Games
Es todo un poco Heath-Robinson, pero mi sistema funciona como abajo. Tenga en cuenta el código es todo avaialble en GitHub, y el siguiente se copia desde el readme.md de la repo:
Hay 2 puntos de entrada principales – diseñado para ser ejecutado desde AWS Lambda:
- lambdaCondensedGame,js – Comprueba si un flujo de juego condensado está disponible para un equipo determinado en un día determinado
- lambdaMonitor.js – Verá si se ha añadido un juego condensado, y si es así envía un mensaje de Slack diciendo que un nuevo juego está listo, además de un enlace al stream
Función de Juego Condensado
Esta función lee desde el JSON POSTed formateado como:
{
gameDate: "2019-04-26",
team: "nym"
}
También debe enviar una cabecera HTTP de MLBAPIRequest
con un valor establecido como una variable de entorno del mismo nombre.
Esto entonces:
- Construye la URL como http://gd2.mlb.com/components/game/mlb/year_2018/month_06/day_26/master_scoreboard.xml (usando la fecha entrante)
- Busca el nodo <game> donde home_file_code=»nym» o away_file_code=»nym» (usando el equipo entrante)
- Recoge el atributo game_pk para obtener la URL e.g. «https://statsapi.mlb.com/api/v1/game/530594/content?language=en»
- Buscar en los nodos media.epgAlternate la sección «Extended Highlights», y luego encontrar el elemento que es el video del juego condensado (si existe)
- Elegir el nodo URL correcto – el video que tiene un valor que termina en .mp4
Suponiendo que se encuentra un juego condensado, la función entonces devuelve JSON como:
{
"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:
- El atributo
opponent
puede ser nulo si no se ha encontrado ningún juego - El atributo
url
puede ser nulo si no se ha encontrado ningún flujo de juego condensado para el juego - El
mediaType
atributo puede ser nulo o «Extended Highlights» (experimenté con obtener también el «Recap» por un tiempo)
Configuración – Variables de entorno
-
MLBAPIRequest
: El valor a enviar en la cabecera de cualquier petición
Función de monitorización
Esta función guarda los últimos datos de la partida encontrados en un bucket de S3, y luego está diseñada para ejecutarse en un horario para hacer lo siguiente:
- Mira la fecha en el JSON de los datos de la partida guardada desde la última ejecución exitosa
- Si la fecha es hoy, hemos terminado (¡todavía no nos ocupamos de las partidas dobles!)
- De lo contrario, llama a la función de juego condensado para ayer o para hoy (si el último juego fue ayer), y si el resultado tiene un atributo url
- Guardar los datos del último partido JSON en S3
- Llamar a Slack enviando el atributo url en un mensaje
- Llamar a un hook web de IFTTT que envíe una notificación de iOS, al pulsar la cual se abre la URL del viedo
Puedes configurar una programación en Cloudwatch para que se ejecute cada N minutos.
Configuración – Variables de entorno
-
S3ACCESSKEYID
: Clave de acceso para el bucket de S3 para guardar los datos del juego -
S3DATABUCKET
: Nombre del bucket de S3 para guardar los datos del juego -
S3DATAFILE
: Nombre del archivo para guardar los datos del juego en -
S3SECRETACCESSKEY
: Secreto de acceso del bucket S3 para guardar los datos del juego -
SLACK_WEBHOOK_URL
: URL del webhook al que enviar el mensaje de Slack -
TEAM
: Abreviatura del equipo a monitorizar, por ejemplo. nym -
IFTTT_EVENT_NAME
: Nombre del evento IFTTT al que enviar la llamada de notificación -
IFTTT_MAKER_KEY
: Nombre de la clave del creador IFTTT para habilitar las llamadas IFTTT
Summary
Todo está funcionando muy bien hasta ahora, y estoy consiguiendo exactamente lo que necesito. ¡Muy contento! Puede que me suscriba a MLB TV más adelante en la temporada si me pierdo los juegos en vivo del fin de semana – o de hecho si los Mets se meten en una carrera de playoffs – pero por ahora puedo seguir wtaching los aspectos más destacados sin ella.
La «API» de MLB fue un poco en el flujo de las primeras semanas de la temporada. ¡No es una API pública, así que es de esperar, pero espero que sea estable por un tiempo.
También construí un acceso directo de iOS para llamar a la API directamente, así que si por alguna razón la URL del video cambió, o me perdí/borré la notificación por accidente.
Si desea configurar algo similar para usted y las instrucciones de GitHub no son claras, hágamelo saber y voy a tratar de ayudarle!