Script para ver horário de programação da tv aberta

Introdução

A minha motivação para criar esse script foi para brincar um pouco com o bash e extração de dados com o SED. Após alguns testes e usos percebi que o script não ficou tão ruim quanto eu pensava que iria ficar. :)

Com uma simples execução, temos acesso ao horário em que cada programa irá passar em um determinado canal. Veja que a programação é referente a São Paulo (eu acho), mas para muitos programas, àqueles de rede nacional (JR, Fantástico, Pânico, CQC, etc, etc) o horário é o mesmo para todo o país.

O script: showtv

Antes de tudo, o código do script. Copie e cole em um arquivo de nome showtv.

#!/bin/bash
# [showtv]
# Script que mostra a grade de programação
# da tv aberta.
#
# [Autor]
# Marcos Paulo Ferreira (Daemonio)
# undefinido gmail com
# http:/daemoniolabs.wordpress.com
#
# [Codificação]
# Script: UTF-8
# Saída : UTF-8 (variável CODIFICACAO)
#
# [Execução]
# $ ./showtv
#   (escolha o canal)
#   (escolha o dia)
#
# [Dependências]
# Baixe os seguintes programas antes
# de continuar:
#   + lynx
#
#
# + Versão 2.0, by daemonio @ Fri Jun 13 17:01:05 BRT 2014
#   - Tudo mudou, inclusive o site de programação
# + Versão 1.2, by daemonio @ Wed Nov 27 15:08:05 BRST 2013
#   - Script anterior parava na primeira linha vazia
#     entre as programações, assim ele não retornava nada.
#   - Essa versão corrige esse erro modificando o último SED.
#     Se linha vazia: ':c; n; /^ *$/bc' então continue lendo.
# + Versão 1.1, by daemonio @ Wed Jul 11 00:11:36 BRT 2012
#   - Reescrita do código fonte.
# + Versão 1.0, by daemonio @ Tue Jan 18 17:46:23 BRST 2011
#


#
# Variáveis globais.
#

# Visitem a página do MEUGUIA (deem uma forcinha :D)
MEUGUIA_ABERTA='http://www.meuguia.tv/programacao/categoria/Aberta'
MEUGUIA_CANAL='http://www.meuguia.tv/programacao/canal/'

# Arquivos temporários.
PAGINA='/tmp/pagina_1.'$$
LISTA='/tmp/lista.'$$

# Lynx.
LYNX='lynx -dump -width=300 -accept_all_cookies'

# Link de um canal específico: MEUGUIA_CANAL + IDCANAL
LINKCANAL=

# Canais. Os códigos são obtidos no site do MEUGUIA
declare -A CANAIS
CANAIS['Aberta']='Programação AGORA'
CANAIS['GRD']='GLOBO'
CANAIS['SBT']='SBT'
CANAIS['BAN']='Band'
CANAIS['REC']='Record'
CANAIS['RTV']='Rede TV'
CANAIS['CUL']='TV Cultura'
CANAIS['MTV']='MTV'
CANAIS['RCN']='Record News'
CANAIS['TED']='TV Brasil'
CANAIS['TBC']='TV Brasil Central'
CANAIS['C21']='Canal 21'
CANAIS['GAZ']='Tv Gazeta'
CANAIS['VDA']='Rede Vida'

# Cores (setadas com tput)
USARCORES='1'
arraycores[0]='1' # 1 = vemelho
arraycores[1]='2' # 2 = verde
arraycores[2]='3' # 3 = amarelo
arraycores[3]='4' # 3 = azul

# Escolha a adequada para seu terminal
#CODIFICACAO='UTF-8'
CODIFICACAO='ISO-8859-1'

#
# Funções
#

function mudar_codificacao() {
iconv -f 'ISO-8859-1' -t $CODIFICACAO -
}

function echocomcor() {
local f="$1"
shift

if [ $USARCORES == 1 ]
then
    tput setaf ${arraycores[$f]};
    tput bold;
fi

echo "$*";
tput sgr0
}

function sair {
rm -f $PAGINA
exit
}

function obter_lista_canais() {
for chave in ${!CANAIS[@]}; do echo "${CANAIS[$chave]}"; done
}

function obter_chave_para_valor() {
local valor="$1"
local chave=
for chave in ${!CANAIS[@]}; do
    [ "${CANAIS[$chave]}" = "$valor" ] && echo $chave && return
done
# nunca retornará isso?
echo NULL
}

function colorir_saida() {
local f=0
sed 's/^\s*%\s*/%/; s/^\s*[*]\s*/*/' | \
    while read
    do
        f=2
        [ "${REPLY:0:1}" = '%' ] && f=0 && REPLY=${REPLY:1}
        [ "${REPLY:0:1}" = '*' ] && f=1 && REPLY='  '${REPLY:1}
        echocomcor $f "$REPLY"
    done
}

function encontrar_dependencia() {
if ! which "$1" > /dev/null 2>&1
then
    tput setaf 1; tput bold
    echo "O programa $1 parece não estar instalado. Instale-o antes"
    echo "de usar."
    tput sgr0
    exit 1;
fi
}

function mostrar_programacao_agora() {
sed -n '
    /^\s*[*]/ {
      s/^[0-9[ *]*]//
      h;
      n;
      s/\(.*\)|\(.*\)/\n%\2\n*\1/
      G;
      p
  }' < $PAGINA
}

function mostrar_programacao_toda() {
sed -n '
    :a;n;/^\s*[*]/!ba;
    :b
      n
      /^\s*[*]/ {
         /,/  s/[*]/%/
         p
         /,/! {n; p}
       }
     bb
' < $PAGINA
}

function mostrar_programacao_dia() {
local DIA="$1,"
sed -n '
    :a;n;/^\s*[*]/!ba;
    :b
       /^\s*[*]\s*'$DIA'/ {
          s/[*]/%/
          p;
          :c
             n;
             /,/bb
             /^\s*$/q
             p;
             n; p
             n;
           bc
        }
        n
     bb
' < $PAGINA
}

#
# Main
#
 
encontrar_dependencia 'lynx'

# Menu de Canais
CANAL=
OIFS=$IFS
IFS='
'
select CANAL in $(obter_lista_canais) $'Sair'
do
    if [ "$CANAL" ] ;
    then
        [ "$CANAL" = "Sair" ] && sair
        break ;
    fi
    echocomcor 0 '[+] Digite uma opção válida.'
done
IFS=$OIFS

IDCANAL=$(obter_chave_para_valor "$CANAL")

# Programação nesse momento
if [ "$IDCANAL" = 'Aberta' ]
then
    echocomcor 3 '[+] Baixando a página da programação nesse momento...'
    $LYNX "$MEUGUIA_ABERTA" > $PAGINA
    mostrar_programacao_agora | mudar_codificacao | colorir_saida
    sair
fi

# Programação semanal

# Menu de dias da semana
DIA=
select DIA in Domingo Segunda Terça Quarta Quinta Sexta Sabado Tudo Sair
do
if [ "$DIA" ] ;
    then
        [ "$DIA" = "Sair" ] && sair
        break ;
    fi
    echo 'Digite uma opção válida.'
done
DIA=${DIA/Sabado/S.bado}

echocomcor 3 '[+] Baixando a página da programação do dia escolhido...'
LINKCANAL=${MEUGUIA_CANAL}${IDCANAL}
$LYNX "$LINKCANAL" > $PAGINA

# Escolheu mostrar tudo
if [ $DIA = 'Tudo' ]
then
    echocomcor 0 '[+] Aviso: Saída pode ser muito longa... pressione ENTER'
    read
    mostrar_programacao_toda | mudar_codificacao | colorir_saida
else
    # Mostra um dia específico
    echocomcor 3 '[+] obs: pode haver mais de uma programação para esse dia'
    mostrar_programacao_dia $DIA | mudar_codificacao | colorir_saida
fi

sair
#EOF

Executando

Para executá-lo, siga os passos:

$ chmod +x showtv
$ ./showtv

Em seguida selecione o canal e o dia. A saída será algo como:

Saída showtv

Problemas no Ubuntu

Algumas distribuições não vêm com o lynx instalado, como o Ubuntu. O programa lynx, nada mais é que um browser de linha de comando, e o showtv necessita dele para funcionar.

Se você usa o Ubuntu e não tem o lynx instalado, siga os passos:

$ sudo apt-get install lynx
# Verifique se está tudo bem, digitando:
$ lynx --help

Agora execute o script normalmente, e se tudo estiver ok, a grade de programação será mostrada.

Detalhes do código

O script extrai todas as informações da página:

http://www.meuguia.tv/programacao/categoria/Aberta

Primeiro ele gera um menu para você escolher um canal. Logo depois ele acessa o link desse canal escolhido, e em seguida, gera um segundo menu, para que o dia da semana seja informado. Por fim, ele mostra no terminal a programação do canal.

Canais disponíveis

Os canais aceitos pelo script são os mesmos que estão no link do terra. São eles:

* Bandeirantes
* Cultura
* Gazeta
* Globo
* MTV
* Record
* Record News
* Rede 21
* RedeTV!
* SBT
* TV Brasil

4 pensamentos sobre “Script para ver horário de programação da tv aberta

    • Olá, faça o download do script e retire a extensão .docx (renomeando o arquivo). O nome então será showtv. No terminal, digite:

      $ chmod +x showtv

      E execute o script:

      $ ./showtv

      Se você está utilizando o ubuntu, é necessário instalar o lynx antes:

      $ sudo apt-get install lynx

      Eu vou editar esse post para incluir essas informações. Qualquer dúvida poste nos comentários.

      Abraços

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s