Conhecendo as condições de trabalho dos Mets sem precisar de uma assinatura de TV MLB
Cross postado de meu blog em https://writingontablets.com/Getting-Alerts-For-MLB-Condensed-Games
30 anos atrás eu passei um par de verões trabalhando em New Jersey, e foi arrastado para o mundo louco do basebol dos New York Mets.
Back então, manter contato quando voltava para casa significava vasculhar o International Herald Tribune para qualquer notícia de beisebol, mas na última década eu fui assinante do MLB TV que tem sido fantástico.
Ao considerar renovar a assinatura deste ano, percebi que quase não assisto mais nenhum jogo ao vivo. A maioria dos jogos é jogada à noite no US Eastern Time ou mais tarde, então o que eu geralmente faço é esperar até a manhã seguinte e tentar assistir ao jogo condensado – cerca de 5 minutos de “Match Of The Day” estilo highlights – sem saber o resultado.
MLB são muito menos preciosos com seus pacotes de highlights do que a Premier League (surpresa, surpresa!), e disponibilizar muito conteúdo gratuitamente no YouTube e na aplicação MLB TV gratuitamente.
No entanto, na aplicação MLB TV não é possível receber notificações para quando novos jogos condensados estão disponíveis sem uma assinatura paga (o que é justo!), e é realmente difícil verificar quando um vídeo está pronto sem descobrir a pontuação, ou alguma informação sobre o jogo através dos outros vídeos já publicados.
No entanto, o excelente Baseball Theater havia descoberto que a configuração para os aplicativos móveis é mantida em aberto, o que me deu a idéia de hackear juntos uma solução similar para enviar alertas assim que houver um novo jogo condensado pronto para visualização.
Meu sistema de alerta de jogos condensados MLB
É tudo um pouco Heath-Robinson, mas meu sistema funciona como abaixo. Note que o código é todo disponível no GitHub, e o abaixo é copiado do readme.md do repo:
Existem 2 pontos de entrada principais – projetados para serem executados a partir do AWS Lambda:
- lambdaCondensedGame,js – Verifica se um fluxo de jogo condensado está disponível para uma determinada equipe em um determinado dia
- lambdaMonitor.js – Verifica se um jogo condensado foi adicionado, e se sim envia uma mensagem de Slack dizendo que um novo jogo está pronto, mais um link para o stream
Função Jogo Condensado
Esta função lê do formato POSTed JSON como:
{
gameDate: "2019-04-26",
team: "nym"
}
Você também deve enviar um cabeçalho HTTP de MLBAPIRequest
com um valor definido como uma variável de ambiente com o mesmo nome.
Isso então:
- URL do tipo http://gd2.mlb.com/components/game/mlb/year_2018/month_06/day_26/master_scoreboard.xml (usando a data de entrada)
- Look for <game> node where home_file_code=”nym” or away_file_code=”nym” (usando a equipe de entrada)
- Pick up game_pk attribute to get the URL e.g. “https://statsapi.mlb.com/api/v1/game/530594/content?language=en”
- Localize nos nós media.epgAlternate a seção “Extended Highlights”, e então encontre o item que é o vídeo condensado do jogo (se ele existir)
- Pick up o nó URL correto – o vídeo que tem um valor que termina em .mp4
Assumindo que um jogo condensado é encontrado, a função então retorna 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:
- O atributo
opponent
pode ser nulo se nenhum jogo tiver sido encontrado - O atributo
url
pode ser nulo se nenhum jogo condensado tiver sido encontrado para o jogo - O atributo
mediaType
atributo pode anular ou “Extended Highlights” (Experimentei também obter o “Recap” por um tempo)
Configuração – Variáveis de ambiente
-
MLBAPIRequest
: O valor a ser enviado no cabeçalho de qualquer pedido
Função de monitoramento
Esta função salva os dados do último jogo encontrado em um balde S3, e então é projetado para executar em um cronograma para fazer o seguinte:
- Looks at date in saved game data in the save data from the last successful run
- Se a data for hoje, estamos prontos (ainda não lidamos com cabeçalhos duplos!)
- Outra, chame a função de jogo condensado para ontem ou para hoje (se o último jogo foi ontem), e se o resultado tiver um atributo url
- Guardar os últimos dados do jogo JSON para S3
- Call Slack enviando o atributo url numa mensagem
- Call um gancho web IFTTT que envia uma notificação iOS, clicando em que abre a URL do viedo
Pode configurar um horário no Cloudwatch para correr a cada N minutos.
Configuração – Variáveis de ambiente
-
S3ACCESSKEYID
: Chave de acesso para o balde S3 para salvar dados do jogo -
S3DATABUCKET
: Nome do balde S3 para salvar dados do jogo -
S3DATAFILE
: Nome do arquivo para salvar dados do jogo -
S3SECRETACCESSKEY
: Acesso secreto para o balde S3 para salvar dados do jogo -
SLACK_WEBHOOK_URL
>: URL do gancho da web para enviar a mensagem Slack para -
TEAM
: Abreviação da equipe para monitorar, por exemplo nym -
IFTTT_EVENT_NAME
: Nome do evento IFTTT para enviar a chamada de notificação para -
IFTTT_MAKER_KEY
: Nome da chave do fabricante do IFTTT para habilitar as chamadas IFTTT
Sumário
Todos os eventos estão funcionando muito bem até agora, e eu estou recebendo exatamente o que preciso. Muito feliz! Eu ainda posso assinar a MLB TV mais tarde na temporada se eu estiver perdendo os jogos ao vivo do fim de semana – ou mesmo se os Mets entrarem em uma corrida de playoff – mas por enquanto eu posso continuar a fazer os destaques sem ela.
A “API” da MLB esteve um pouco em fluxo durante as primeiras semanas da temporada. Não é uma API pública, então isso é de se esperar, mas espero que fique estável por um tempo agora.
Eu também construí um atalho iOS para chamar a API diretamente, então se por alguma razão a URL do vídeo mudou, ou eu perdi/apaguei a notificação por acidente.
Se você quiser configurar algo similar para você e as instruções do GitHub não estiverem claras, me avise e eu tentarei te ajudar!