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 um comentário