Leitor de RSS para TV Digital

Com a possibilidade de se ter internet a partir da TV, por meio de um cabo de rede conectado do Set-top Box a um modem ADSL, ou por qualquer outro tipo de conexão, uma aplicação que pode ser muito útil e conveniente de se ver na tela da TV é o famoso leitor de RSS, para que o telespectador possa ver notícias sentado no sofá da sala.

Com este objetivo, estou disponibilizando uma aplicação deste tipo. A aplicação NCLua RSS Reader foi desenvolvido em NCLua. Ela exibe notícias da intenet, a partir de um feed RSS. O arquivo XML do feed é baixado diretamente de um site e as notícias são exibidas na tela. Elas são exibidas uma após a outra, de forma automática. O usuário ainda pode usar as setas do controle remoto para avançar ou retroceder. O botão vermelho pode ser usado para fechar a aplicação.

Para download do arquivo XML, foi utilizada a classe TCP, disponibilizada aqui. Uma grande dificuldade que tive, em relação à aplicação anterior, o Sistema de Enquete, foi que, segundo o que li sobre o protocolo HTTP, no final da mensagem de requisição é necessário haver uma quebra de linha (n). Porém, para obtenção do XML a partir de um servidor Web, só funcionou com duas quebras de linha. Só descobri isso depois de fazer as requisições HTTP na mão, usando telnet. Assim, pode ser que muitas das dificuldades relatadas sobre o uso da classe TCP, sejam por falta de um n a mais no final da mensagem HTTP.

Ah, não esqueça de configurar a interface de rede do VMWare player para o modo Bridge, senão, pode não funcionar. Veja como fazer isso aqui.

Se o feed RSS possuir formatação HTML, o sistema não renderizará a mesma, pois para isso precisaria salvar de cada notícia para um arquivo HTML, mas não quis me preocupar com isso.

O processamento do arquivo XML foi feito utilizando-se o Lua XML Parser disponível em http://lua-users.org/wiki/LuaXml. O parser gera uma table em Lua, a partir do código XML, tornando bem simples a tarefa de recuperar os valores do XML. Porém, o código apresentado lá não compila em Lua 5.x. Assim, nos fontes da aplicação tem todo o código adaptado para Lua 5.x. A versão alterada da biblioteca pode ser baixada aqui também. O Johnny Moreira Gomes fez um tutorial mostrando como usar a biblioteca LuaXML, também disponível aqui.

A URL do arquivo XML do feed está hard coded na aplicação. Assim, para obter notícias de outro feed, abra o código fonte e altere as variáveis host e uri. Alguns servidores, como o g1.globo.com, requerem que a requisição HTTP inclua a URL completa (host + uri). Servidores como do R7 funcionam tanto contendo apenas a URI como a URL completa na requisição. Aparentemente, todos suportam a URL completa, que pode ser usado como padrão, para não necessitar criar regras para servidores diferentes. Outros, como o do UOL, necessitam que sejam implementado o redirecionamento de URL’s. Quando uma requisição é feita para um endereço que mudou, é necessário tratar a mensagem, que contém o novo endereço.

Uma forma simples de testar se a requisição para um determinado servidor está correta é usar telnet:

telnet servidor.com.br 80
GET
http://servidor.com.br/endereco/do/arquivo/xml HTTP/1.1 (Pressione enter)
Host: servidor.com.br (Pressione dois enter)

O código está todo comentado para facilitar o entendimento. O vídeo disponibilizado tem licença Creative Commons e foi obtido aqui. As imagens das setas foram obtidas aqui, e são de domínio público. A imagem “Fechar” foi gerada a partir da ferramenta web livremente disponível aqui.

Uma restrição da aplicação, é que se o feed possuir mais de um canal (channel), apenas o primeiro será analisado, porém, isto é bem simples de ser melhorado.

Pré-Requisitos

É recomendado a utilização do Ginga Virtual STB 0.11.2 rev 23 ou superior. A versão anterior do Ginga VSTB possuia algumas dificuldades para acesso à rede a partir da VM, normalmente necessitando de configurações na interface de rede da mesma.

Antes de usar a aplicação na VM, verifique se a mesma está acessando a rede local/internet (usando ping, telnet, wget, curl ou qualquer comando similar). Para isto, fundamentalmente, na tela inicial da VM deve ser exibido o IP da mesma. Caso não esteja conseguindo acesso à rede, tente alterar o modo da interface de rede da VM de bridge para NAT ou vice-versa (é necessário reiniciar a VM após tal alteração).

Download

Acesse a página do projeto no GitHub para download.

Licença


Doações

Suporte o desenvolvimento e melhorias no projeto. Faça uma doação.


Outros Projetos

Veja outros projetos de TV Digital aqui.

[catlist=259]

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)
Nenhuma tag para este post.
  • Pingback: Manoel Campos Blog » Leitor de RSS em NCLua para TV Digital()

  • Henrique Becker

    Olá Manuel,
    Eu tenho uma dúvida, como a especificação do uso da Lua no Ginga-NCLua pela PUC-Rio (Part 10 – Imperative Objects in NCL: The NCLua Scripting Language) na página 25 especifica que todas as funções do módulo io não podem ser usadas dentro do Ginga-NCLua, e a sua aplicação faz uso delas, é correto concluir que ela não funcionará em um Set-Top Box com uma implementação do ginga em conformance com o padrão?

  • http://manoelcampos.com Manoel Campos da Silva Filho

    No caso do leitor de rss, a única função que usa o módulo io, possui na sua documentação uma informação indicando que a mesma deve se utilizada apenas para depuração (em ambientes de teste como o Ginga Virtual STB). Observei o código e vi que usei um io.write. Já o substitui por printf. Assim, a aplicação pode ser baixada novamente que está dentro dos padrões (pelo menos não vi nenhum outro recurso recusado pelas normas).

    Obrigado pela observação.

  • Silvio Garbes

    Sugestão:
    No código main.lua você utiliza o seguinte comando para separar o cabeçalho HTTP do corpo da mensagem:

    local i = string.find(result, “?xml version=”)
    if i then
    result = string.sub(result, i-1, #result)
    end

    Sugiro adotar outra forma de separação do resultado, como da seguinte forma:

    local i = string.find(result, string.char(13,10,13,10))
    if i then
    result = string.sub(result, i+4, #result)
    end

    Assim, independente do conteúdo no corpo da mensagem a separação sempre será feita. Alguma restrição nisso?

  • http://manoelcampos.com Manoel Campos da Silva Filho

    Não vejo nenhum problema nisso. Com este seu código, a função pegaria o conteúdo após as duas quebras de linha (que separam o cabeçalho http do conteúdo). Você chegou a testar? O código funcionou?

  • Silvio Garbes

    Sim, cheguei a testar e o código funcionou.

  • Claudionovaes

    Como eu faço para alterar as dimensões do retângulo ? Não consegui, pelo que entendi suas dimensões já estão instanciadas, minha dúvida é como eu poderia alterar as dimensões desse retângulo.

    Obrigado.

  • http://manoelcampos.com Manoel Campos da Silva Filho

    Neste caso, o tamanho do retângulo é o da região do nó lua no documento NCL.

  • Guest

    hola, Una pregunta porque utilizas tcp.receive (“* a”) en lo entiendo “* a” me explico podrias porfavor

  • http://manoelcampos.com Manoel Campos da Silva Filho

    a = all
    Para obter todos os dados da resposta de uma so vez, com uma unica chamada de tcp.receive
    Em 13/08/2013 12:34, “Disqus” escreveu:

  • fellass88 .

    muito obrigado

  • Tom

    Olá Manoel, gostaria de usar um xml nativo, que já se encontra na aplicação, sem precisar buscar via rede, isso para o caso das tvs que não estão conectadas, como posso proceder com o código?

    Obirgado,

  • http://manoelcampos.com Manoel Campos da Silva Filho

    Se o xml vai ser enviado junto com a app, não necessitando de acesso ao canal de retorno, para mim não faz sentido usar tal formato
    de arquivo, a não ser que não haja como evitar o uso do XML.
    A linguagem Lua além de uma linguagem de programação é uma linguagem de descrição de dados.
    Assim, pode-se representar os dados que quiser em um arquivo Lua e carregar tal arquivo na aplicação nativamente, sem ter que recorrer a bibliotecas externas.

    Se desejar testar o uso de Lua como arquivo de dados, veja estes links: http://manoelcampos.com/2010/06/08/aplicacao-de-tv-digital-usando-arquivos-de-dados-em-lua/ http://manoelcampos.com/2011/08/03/convertendo-arquivos-xml-para-arquivos-de-dados-lua-para-uso-em-aplicacoes-de-tvd-gingancl/
    Se desejar usar XML mesmo veja: http://manoelcampos.com/2011/10/17/lendo-xml-em-lua-com-luaxml-parser-totalmente-lua-tvd-gingancl/

  • Tom

    Concordo com você a respeito de não ter sentido, mas estou pensando em atualizar o xml embarcando-o na aplicação, e a atualização fica por conta do carrosel de dados que transmitirá a aplicação. Assim o telespectador terá uma notícia atualizada tendo ou não a Tv conectada na internet. Nesse aplicativo, como eu faria para utilizar o xml embarcado na app?

  • http://manoelcampos.com Manoel Campos da Silva Filho

    O que digo de não fazer sentido é usar xml, pois pode colocar os dados num arquivo lua e fazer o mesmo, sem uso de canal retorno.
    A não ser que haja alguma restrição, vc pode usar arquivos lua.
    Veja os links que passei, para os dois casos.