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:
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
como vou mudar a extensão e para qual mudar ?
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
Post editado em: 11/07/2012
Script atualizado em: 13/06/2014