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:

  1. lambdaCondensedGame,js – Verifica se um fluxo de jogo condensado está disponível para uma determinada equipe em um determinado dia
  2. 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:

  1. URL do tipo http://gd2.mlb.com/components/game/mlb/year_2018/month_06/day_26/master_scoreboard.xml (usando a data de entrada)
  2. Look for <game> node where home_file_code=”nym” or away_file_code=”nym” (usando a equipe de entrada)
  3. Pick up game_pk attribute to get the URL e.g. “https://statsapi.mlb.com/api/v1/game/530594/content?language=en”
  4. 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)
  5. 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!

Deixe uma resposta

O seu endereço de email não será publicado.