O que é o Arduino? Em que difere da Raspberry PI?


O Arduino é uma placa que contem um microcontrolador. Foi criado para facilitar a utilização de componentes electrónicos em campos multidisciplinares de forma simples e barata. O hardware consiste numa placa opensource cujo elemento central é um controlador Atmel AVR de 8-bits (os modelos mais recentes já contém um controlador Atmel ARM de 32-bit). O software consiste num compilador de uma linguagem específica (o Arduino) e num bootloader que é executado no microcontrolador. Esta linguagem é baseada numa outra linguagem chamada Processing, semelhante ao C.
Podem ser comprados em forma de board já montada ou em kits de “faça você mesmo”, sendo pública a informação de como fazer a própria placa. Estima-se que cerca de 300.000 Arduinos já foram produzidos até ao momento. É a plataforma de prototipagem electrónica de eleição!

Qual é a principal diferença entre um Arduino e uma Raspberry PI?

De forma simples, enquanto que a Raspberry PI é um mini-computador, desenvolvido para que as crianças aprendam programação; o Arduino é um micro-controlador desenvolvido para que as crianças aprendam electrónica e circuítos electricos. Que desenvolvam, não software, mas sim hardware que possa interagir com o mundo real.

A força do Arduino é a comunicação Input-Output (I/O) enquanto que podemos dizer que a Raspberry PI é um equipamento de processamento que também possui alguns pins GPIO. As conexões I/O da Raspberry PI não têm nenhum sistema de protecção que proteja o seu chip em caso de acidente (e estes estão ligados directamente ao chip). Isto significa que se um erro for cometido, o mais provável é “fritar” o broadcom chip da RasPi.

Desta forma, apesar de ser possível realizar grande parte dos projectos do Arduino com uma Raspberry PI, para iniciantes e para aqueles que pretendem mais opções de ligação entre o processamento e o mundo real...o Arduino é a escolha acertada.
São duas placas diferentes e que se complementam. Por exemplo, podemos ler valores de sensores conectados ao Arduino (temperatura, luz, posição, etc) e enviar essa informação à Raspberry PI. Consoante o nosso comando (inclusive via web) na Raspberry PI, devolvemos informação ao Arduino e fazêmo-lo responder através de um actuador (um relé, uma luz, uma mensagem, um motor, etc). Também seria possível realizar tudo isto apenas com o Arduino, ou apenas com a Raspberry PI. No primeiro caso, o numero de componentes tomaria valores exorbitantes e no segundo...existe uma forte probabilidade de enviarem a vossa Rpi às ortigas se não tiverem noção daquilo que estão a fazer.

Espero que tenha sido razoavelmente claro na explicação :)

Fiquem com um documentário acerca da história do Arduino:




Miguel Borges de Freitas

0 Comments:

XBMC - O teu primeiro addon - 4 - (resposta aos 2ºs desafios)

Olá,

O último post desta secção terminou com mais dois desafios.


- Coloquem uma imagem personalizada nos menus do addon
- Alterem o tipo de vista da listagem de vídeos para thumbnails

Aqui ficam as resoluções




1 - Coloquem uma imagem vossa nos menus do addon

Quando criei o ficheiro addon.py reservei um espaço no topo do ficheiro para as bibliotecas de python a importar e para escrever algumas definições. Nessa secção encontram isto:


   
addon_id = 'plugin.video.maisfutebol'
selfAddon = xbmcaddon.Addon(id=addon_id)
addonfolder = selfAddon.getAddonInfo('path')
artfolder = '/resources/img/'

Pretendia simplificar a identificação do nome do addon, do caminho para o addon no vosso computador e a localização da pasta de imagens.

Se abrirem a pasta /resources/img/ verificarão igualmente que lá deixei propositadamente uma imagem (tv.png)




Desta forma, se quiserem adicionar as vossas thumbnails personalizadas aos menus do addon devem colocar as imagens na pasta /resources/img e chamar a imagem da seguinte forma:

addonfolder + artfolder + 'nome_do_ficheiro_de_imagem'

Por exemplo, imaginem que queremos colocar esta imagem (tv.png) no menu 'VÍDEOS' (função CATEGORIES()). É só modificar a função deste modo:
   
def CATEGORIES():
 addDir('VIDEOS','http://www.maisfutebol.iol.pt/videos',1,addonfolder + artfolder + 'tv.png')

E voilá:







2 - Alterar o tipo de vista de um menu

O tipo de vista depende do tema e tem um id associado. Para a skin confluence (padrão do XBMC), podem consultar os tipos de vista disponíveis aqui:

http://gitorious.org/xbmc/xbmc/blobs/ce9e2ac15a78dc87a49aa17c6d251b3524d2cac2/addons/skin.confluence/720p/MyVideoNav.xml

Temos disponíveis estes id's de tipo de vista:

<views>50,51,500,550,560,501,508,504,503,504,511</views>

Resta-nos perceber qual é o tipo de vista que pretendemos. Neste caso, queremos a vista de thumbnails. Nesse documento xml, temos o significado dos vários id's.

   
  

   Window_OpenClose_Animation  
 
   CommonRootView 
 
   FullWidthList 

   ThumbnailView 
 
   PosterWrapView 
 
   PosterWrapView2_Fanart 
 
   MediaListView3 
 
   MediaListView2 

   WideIconView 
 
   MusicVideoInfoListView 
 
   AddonInfoListView1 

   LiveTVView1 
 
  

A vista de thumbnails é portanto, o id 500.

Adicionemos o seguinte no final da função listar_videos(url). Iremos adicionar à última linha da função para que o XBMC apenas altere o tipo de vista após listar todos os vídeos e a directoria de "página seguinte"!


   
xbmc.executebuiltin("Container.SetViewMode(500)")

Onde o 500 é o ID do tipo de vista que pretendemos. A função final fica assim:



   
def listar_videos(url):
 codigo_fonte = abrir_url(url)
 match=re.compile('<li><a class="" href="(.+?)"><span class="player"></span><img src="(.+?)"\n                                alt=".+?" />(.+?)<br /><em>(.+?)</em></a></li>').findall(codigo_fonte)
 for url, img, titulo, data in match:
  codigo_fonte_pagina_de_video = abrir_url('http://www.maisfutebol.iol.pt' + url)
  match = re.compile('.*file=(.+?)&amp;streamer=(.+?)amp;config.+?\n.+?<meta http-equiv="X-UA-Compatible"').findall(codigo_fonte_pagina_de_video)
  for ficheiro, streamer in match:
   ficheiro = ficheiro.replace('%3A',':')
   streamer = streamer.replace('%3A',':')
   streamer = streamer.replace('%2F','/')
   #nesta altura streamer = rtmp://video1.iol.pt/vod&
   match = re.compile('rtmp://(.+?)/(.+?)&').findall(streamer)
   for rtmp,app in match:  
    addLink(titulo,'rtmp://' + rtmp + ':80/' + app + '/' + ficheiro,img)
        # Parte do codigo para o botao da pagina seguinte
 match = re.compile('.*.+?href="(.+?)">Página Seguinte &gt;</a></div>\n.+?<div class="pub-iol"').findall(codigo_fonte)
 for url_proxima_pagina in match:
  addDir('Proximo >>','http://www.maisfutebol.iol.pt' + url_proxima_pagina,1,'')
 xbmc.executebuiltin("Container.SetViewMode(500)")



Simples certo?



Podem fazer o download do addon.py actualizado aqui:

http://enen92.aminhacasadigital.com/addon3.py

Próximo desafio:
-Coloca uma imagem personalizada na directoria de "próxima página"
-Adiciona um novo menu onde podes pesquisar vídeos (e listar) os resultados da pesquisa.

Até breve,

Miguel








0 Comments:

XBMC - O teu primeiro Addon - 3 - (resposta aos 1ºs desafios)


Se estão recordados, terminei o post anterior com alguns desafios:

-Adiciona a data ao menu dos vídeos

-Adiciona um sub-menu (addDir) de "Página seguinte" na listagem de vídeos
-Escapa o passo intermédio de "encontrar fontes" fazendo a "ponte" entre o modo 1 e o "addLink"

Neste post, apresenta-se a resolução/solução destes “desafios”.

Atenção: O ficheiro python que devem trabalhar é o que se encontra no fim do primeiro post: http://enen92.aminhacasadigital.com/addon.py




1 - Adiciona a data ao menu dos vídeos

Esta é facil!
Pegando mais uma vez no exemplo do trecho do código fonte:


alt="Guardiola em Munique: «Uma honra imensa»" />Guardiola em Munique: «Uma honra imensa»<br /><em>2013-06-24</em></a></li>

Verificamos que a data em que o vídeo foi colocado está entre as tabs <em></em>. É portanto uma questão de "QUERO GUARDAR" e adicioná-la ao ciclo e ao addDir.


   
def listar_videos(url):
 codigo_fonte = abrir_url(url)
 match=re.compile('<li><a class="" href="(.+?)"><span class="player"></span><img src="(.+?)"\n                                alt=".+?" />(.+?)<br /><em>(.+?)</em></a></li>').findall(codigo_fonte)
 for url, img, titulo, data in match:
  addDir(titulo + '-' + data,'http://www.maisfutebol.iol.pt' + url,2,img)

Já lá está:




2 - Adiciona um menu de página seguinte à listagem


Resolver esta, implica pensar um pouco. Devemos procurar no codigo_fonte pelo código html do "link" da página seguinte e se esse existir, retirar o valor do endereço. Procuramos um trecho de código que seja sempre igual, qualquer que seja a página onde estamos. E olhem o que lá está:


<div class="paginator"><span>Página <strong>1</strong> de 26</span><a class="link-next" href="/videos/2">Página Seguinte &gt;</a></div>
<div class="pub-iol" style=


Neste caso estamos na página 1. O "link" de página seguinte tem associado o endereço url da página seguinte...a 2. Se tivermos na pagina 2. Iremos encontrar:


<div class="paginator"><span>Página <strong>2</strong> de 26</span><a class="link-next" href="/videos/3">Página Seguinte &gt;</a></div>
<div class="pub-iol" style=


Logo se recorrermos à regular expression que está na linha abaixo, retiramos o valor da página seguinte! Qualquer que seja a página em que estamos...


   
match = re.compile('.*.+?href="(.+?)">Página Seguinte &gt;</a></div>\n.+?<div class="pub-iol"').findall(codigo_fonte)

E fazemos novamente mais um ciclo idêntico àqueles que estamos fartos de fazer...



   
for url_proxima_pagina in match:
  addDir('Proximo >>','http://www.maisfutebol.iol.pt' + url_proxima_pagina,1,'')

E é questão de adicionar à parte final da função que tínhamos feito (fora do ciclo que lá está!). A função fica assim:



   
def listar_videos(url):
 codigo_fonte = abrir_url(url)
 match=re.compile('<li><a class="" href="(.+?)"><span class="player"></span><img src="(.+?)"\n                                alt=".+?" />(.+?)<br /><em>(.+?)</em></a></li>').findall(codigo_fonte)
 for url, img, titulo, data in match:
  addDir(titulo + '-' + data,'http://www.maisfutebol.iol.pt' + url,2,img)
 match = re.compile('.*.+?href="(.+?)">Página Seguinte &gt;</a>').findall(codigo_fonte)
 for url_proxima_pagina in match:
  addDir('Proximo >>','http://www.maisfutebol.iol.pt' + url_proxima_pagina,1,'')

E por artes mágicas...já temos a directoria de página seguinte:





3 - Escapa o passo intermédio de procurar fontes tal que o vídeo possa ser reproduzido directamente

Esta também é simples. Temos de suprimir o modo 2 e chamar a função addLink logo no modo 1, isto é, na função listar_videos(url). Desta forma, ao invés de adicionar uma directoria que chame uma nova função (no passado encontrar_videos(url)) vamos incorporar grande parte do código desta função na função listar_videos(url).

Ora vejam a função final. Simples...

   
def listar_videos(url):
 codigo_fonte = abrir_url(url)
 match=re.compile('<li><a class="" href="(.+?)"><span class="player"></span><img src="(.+?)"\n                                alt=".+?" />(.+?)<br /><em>(.+?)</em></a></li>').findall(codigo_fonte)
 for url, img, titulo, data in match:
  codigo_fonte_pagina_de_video = abrir_url('http://www.maisfutebol.iol.pt' + url)
  match = re.compile('.*file=(.+?)&amp;streamer=(.+?)amp;config.+?\n.+?<meta http-equiv="X-UA-Compatible"').findall(codigo_fonte_pagina_de_video)
  for ficheiro, streamer in match:
   ficheiro = ficheiro.replace('%3A',':')
   streamer = streamer.replace('%3A',':')
   streamer = streamer.replace('%2F','/')
   #nesta altura streamer = rtmp://video1.iol.pt/vod&
   match = re.compile('rtmp://(.+?)/(.+?)&').findall(streamer)
   for rtmp,app in match:  
    addLink(titulo,'rtmp://' + rtmp + ':80/' + app + '/' + ficheiro,img)
        # Parte do codigo para o "link" da pagina seguinte
 match = re.compile('.*.+?href="(.+?)">Página Seguinte &gt;</a></div>\n.+?<div class="pub-iol"').findall(codigo_fonte)
 for url_proxima_pagina in match:
  addDir('Proximo >>','http://www.maisfutebol.iol.pt' + url_proxima_pagina,1,'')


Podem fazer o download do addon.py final aqui:



Próximos desafios:

- Coloquem uma imagem personalizada nos menus do addon
- Alterem o tipo de vista da listagem de vídeos para thumbnails
(Não foi abordado, olhem para o codigo fonte dos outros addons)

Até breve,

Miguel Borges de Freitas

0 Comments:

Goji Smart Lock com Webcam

Olá a todos!

Hoje em dia podemos encontrar várias fechaduras com Wi-Fi e Bluetooth, mas nenhuma delas tem webcam, mas vem para o mercado no final do ano a Goji Smart Lock.

Semelhante a qualquer outra fechadura inteligente, permitirá abrir e fechar a porta com um smartphone, mas pelo facto desta fechadura possuir uma webcam poderá enviar fotos para o smartphone das pessoas que se encontram em frente à sua porta.


Poderá não só, bloquear ou desbloquear a porta, ou enviar para pessoas autorizadas um "digital lock" por email ou sms, onde poderá definir em que limites de tempo a pessoa autorizada poderá abrir ou fechar a porta. É sem dúvida um pormenor interessante para facultar acesso à nossa casa a pessoas da nossa confiança, em casos pontuais, nas férias, à empregada de limpeza, etc.

A Goji Smart Lock pode ser utilizada com uma chave comum quando necessário, e configurada remotamente via internet, não á esquecer-se do seu smartphone em casa.

Este produto será lançado em Dezembro de 2013 pelo preço indicado de 278 Dólares.



0 Comments:

XBMC - O teu primeiro addon - 2 - (Ficheiros de log)


Durante a fase de desenvolvimento de
um addon cometerão vários erros. Erros de script, incompatibilidades com alguma definição do XBMC, bugs do próprio software etc etc. Seria impossível resolver alguns desses erros sem dispor de alguma "ajuda" ou de uma ferramenta que nos dê alguma informação sobre o erro que ocorreu.

Felizmente, o XBMC escreve para os ficheiros de log muita da informação relevante acerca daquilo que "está a acontecer". Por outro lado, podem utilizar o próprio addon para escrever  informação para o Log de forma a determinar com exactidão em que parte do código ocorreu um determinado problema.

Por exemplo, se ocorrer um erro de script no vosso addon e um determinado utilizador vos disser: "Não consegui fazer a tarefa x, obtive um erro de script". A resposta imediata é "posso ver o log?" ou "podes-me enviar o log?".

Esses ficheiros de log localizam-se em:

Windows:

-Windows XP: Documents and Settings\user\Application Data\XBMC\xbmc.log
-WIndows 7: Users\user\AppData\Roaming\XBMC\xbmc.log

Mac OS:
/Users/user/Library/Logs/XBMC.log

Linux/Linux based:
/home/user/.xbmc/temp/xbmc.log

Será neste ficheiro que deverão procurar a resposta aos vossos problemas.
Um exemplo simples:

-Imaginem que me enganei a adicionar o menu "VIDEOS" na função CATEGORIES(). Em vez de 'VIDEOS' escrevi apenas VIDEOS. Assim:


   
def CATEGORIES():
 addDir(VIDEOS,'http://www.maisfutebol.iol.pt/videos',1,'http://digitalsherpa.com/wp-content/uploads/2013/04/social-media-marketing-tool.png')

Em vez de:


   
def CATEGORIES():
 addDir('VIDEOS','http://www.maisfutebol.iol.pt/videos',1,'http://digitalsherpa.com/wp-content/uploads/2013/04/social-media-marketing-tool.png')

Notarão que ocorreu um determinado erro quando iniciarem o addon:

Se consultarem o ficheiro de log:



Encontrarão facilmente o motivo do erro:

   
22:10:08 T:2860514112   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <type 'exceptions.NameError'>
                                            Error Contents: global name 'VIDEOS' is not defined
                                            Traceback (most recent call last):
                                              File "/home/toshiba/.xbmc/addons/plugin.video.maisfutebol/addon.py", line 141, in <module>
                                                CATEGORIES()
                                              File "/home/toshiba/.xbmc/addons/plugin.video.maisfutebol/addon.py", line 33, in CATEGORIES
                                                addDir(VIDEOS,'http://www.maisfutebol.iol.pt/videos',1,'http://digitalsherpa.com/wp-content/uploads/2013/04/social-media-marketing-tool.png')
                                            NameError: global name 'VIDEOS' is not defined
                                            -->End of Python script error report<--

"Global name VIDEOS is not defined" na linha 33. O que significa isto?

Significa que como não utilizaram "" na palavra VIDEOS, o Python assumiu que se referiam a uma determinada variável chamada VIDEOS que...vocês não definiram. Se utilizarem as "" o Python interpreta a expressão como uma string (uma sequência de caracteres) e não uma variável.

Vamos fazer outra experiência. Corrijam o erro e adicionem print 'Estou no menu inicial' ao fim da função:

   
def CATEGORIES():
 addDir('VIDEOS','http://www.maisfutebol.iol.pt/videos',1,'http://digitalsherpa.com/wp-content/uploads/2013/04/social-media-marketing-tool.png')
 print 'Estou no menu inicial'

Salvem o ficheiro, iniciem o XBMC, entrem no addon e posteriormente no menu 'VIDEOS'. Finalmente, olhem para o ficheiro de log:

   
22:17:38 T:2940054336  NOTICE: -->Python Interpreter Initialized<--
22:17:38 T:2940054336  NOTICE: Mode: None
22:17:38 T:2940054336  NOTICE: URL: None
22:17:38 T:2940054336  NOTICE: Name: None
22:17:38 T:2940054336  NOTICE: Iconimage: None
22:17:38 T:2940054336  NOTICE: Estou no menu inicial
22:17:38 T:2896526144  NOTICE: Thread Background Loader start, auto delete: false

Dá jeito certo?

Se utilizarem Windows podem instalar a ferramenta XBMC log analiser (download) que vos permitirá seguir o log em tempo real (e apresentar as entradas de erro/aviso de forma colorida para fácil identificação).

Bom trabalho.

0 Comments:

Windows 8.1 Preview já disponível

Olá a todos!

Os queixosos sobre o Windows 8 já tem disponível o preview do Windows 8.1 para download no link:
http://windows.microsoft.com/pt-pt/windows-8/preview

Como já disse anteriormente, eu não me incluo neste grupo de pessoas, pois acho como sempre achei o Windows 8 um salto qualitativo face aos OS anteriores da Microsoft, o ambiente duplo resulta na perfeição, basta que o testem e se habituem sem reclamar! :)



2 Comments:

XBMC – O teu primeiro Addon - 1 - (tutorial)


Ultimamente tem sido cada vez maior o interesse da comunidade em torno do XBMC e dos addons portugueses, interesse este bem patente no aumento do número de visitas ao blog e ao fórum. Os developers de addons para o XBMC nem sempre têm tempo para desenvolver mais trabalho ou para corrigir um determinado erro. Na realidade, este consegue ser um trabalho inglório e frustrante. É feito pela comunidade para a comunidade, nos tempos livres e sem lucro envolvido.

Mas vamos por partes (lá para a frente já perceberão porque é frustrante). Afinal, qual é a função de um XBMC addon comum?

Se olharmos para o exemplo de um addon de vídeo, como a rtp play ou o wt, o addon faz essencialmente três coisas:

1- Abre um determinado site
2- Retira a informação essencial que pretendemos obter (exemplo: titulo de um vídeo, thumbnail de um vídeo e endereço do caminho completo para o vídeo)
3- Entrega a informação ao XBMC para este reproduzir o ficheiro (caminho para o video) pretendido.

Posto isto, este post tem como objectivo construir a passo e passo e de forma exaustiva um addon muito simples para listar e reproduzir os vídeos do site: http://www.maisfutebol.iol.pt/videos

Um addon é uma pasta (chamada plugin.video.NOMEDOADDON) com vários ficheiros no interior.
Os principais são o addon.xml e um script desenvolvido em python (addon.py ou default.py ou qualquer outro nome) que contem o código principal do addon. A pasta resources contém outros ficheiros não fundamentais como as imagens dos menus, as definições do addon, as várias traduções do addon.

Neste link podem fazer o download do addon em branco que servirá de base ao desenvolvimento do addon: 


Conteúdo da pasta:



Não se preocupem com o conteúdo da pasta resources (por agora). Vamos olhar apenas para os dois ficheiros principais (addon.xml e addon.py). A imagem fanart e o icon deverão ser editadas se quiserem fazer outro addon (mantendo o nome de ambos os ficheiros!).


Addon.xml

Este é o ficheiro que é iniciado quando o XBMC abre o addon. Contem informações como o nome do addon, a versão, o autor, a descrição, a versão do python que o xbmc deve emular para executar o addon e apresenta o nome do ficheiro principal do addon (desenvolvido em python). Neste caso, addon.py.
Este é um ficheiro xml de fácil leitura e compreensão. Se lerem o parágrafo anterior, perceberão facilmente cada linha deste ficheiro. Se pretenderem fazer um outro addon, alterem os campos óbvios. Atribuam ao nome do addon, o mesmo nome da pasta!


   
    
     
      
     
     
   video   
     
     
   en   
   all   
   Mais futebol   
   O meu primeiro addon   
   all   
     
   


Façam download do zip indicado acima e instalem no xbmc:
System → Settings → addons → install from zip file

Se tudo correr bem, deverão receber a informação de que o addon foi instalado:



Se forem agora a Videos → Addons verificarão que o addon já se encontra na lista e que a informação apresentada é aquela que está escrita no ficheiro xml. O icon e a imagem de fundo são respectivamente os ficheiros icon.png e fanart.jpg. Se entrarem no addon, este não fará nada.


Ficheiro addon.py:

O ficheiro principal do addon que contem o código que o xbmc executa quando "entram" no addon. Poderia ter outro nome (por exemplo: aminhacasadigital.py) desde que indicado no ficheiro xml. Para facilitar, dividi o ficheiro do addon “em branco” em 5 partes:

-Bibliotecas a importar e definicoes: onde devem colocar as bibliotecas de python a importar quando o addon é iniciado. Já tem as bibliotecas fundamentais para fazerem o primeiro addon.
-Menus: onde escreverão os menus
-Funcoes: onde escreverão as funcoes necessárias a executar em cada menu
-Funcoes já feitas: funções que já se encontram construídas e que facilitam o vosso trabalho. Deverão, quando construírem as vossas funções chamar estas funções já construídas. Incluem funções como abrir endereços url, adicionar links ou adicionar directorias ao XBMC.
-Modos: variáveis inteiras que permitem ao xbmc saber “onde estamos”.

Será portanto, neste ficheiro que irão trabalhar!

Após instalado o zip, a respectiva pasta será importada para o xbmc. Assim, iremos editar o ficheiro addon.py importado pelo xbmc e não aquele que se encontra no zip. Este ficheiro (após instalação do "addon em branco") localiza-se em:

Windows: 
C:\Users\Username\AppData\Roaming\XBMC\addons\plugin.video.maisfutebol
MAC OS:
/Users/Username/Library/ApplicationSupport/XBMC/addons/plugin.video.maisfutebol
Linux:
/home/user/.xbmc/addons/plugin.video.maisfutebol

Começar a trabalhar!

Abram o ficheiro addon.py no caminho indicado anteriormente. Em Windows podem usar o bloco de notas ou o Notepad++, em Linux o Gedit e em Mac aconselho o TextMate.

Modo None


Quando o addon é iniciado, o addon.xml indica ao XBMC o nome do ficheiro principal (addon.py) e o XBMC executa esse ficheiro. O XBMC procura em primeiro lugar nos modos. O modo inicial é None (variável sem dados associados). Se procurarmos na "secção modos" (no fim do ficheiro addon.py em branco) veremos:



   
if mode==None or url==None or len(url)<1:
   print ""
   CATEGORIES()


Isto significa que quando o addon.py é iniciado, o mode é None e o XBMC vai correr a função que lá está identificada - neste caso, CATEGORIES(). Esta função é uma função que não recebe qualquer argumento, daí os ().
No topo do ficheiro addon.py, temos a função CATEGORIES(), na "secção MENUS":


  
def CATEGORIES():
        print "primeiro addon"

Esta função, neste momento não está a fazer nada. Está apenas a “imprimir” texto que não aparece no XBMC (unicamente nos ficheiros de log).

Queremos que quando o addon seja iniciado, apareça no menu principal do addon (função CATEGORIES() ) um sub-menu chamado “VIDEOS”. Esta função deverá “entregar” ao XBMC um determinado URL onde se irá procurar os vídeos, o MODO que o XBMC deverá executar quando o utilizador entrar nesse sub-menu e (opcional) deverá ter um ICON (para ficar bonito e tal..).
Podemos fazê-lo facilmente utilizando a função que já está construída (funções já feitas), denominada addDir. Esta recebe 4 argumentos (name,url,mode,thumbnail).

Neste caso queremos:

Name = "Videos" --> nome a apresentar no menu
Url = "http://www.maisfutebol.iol.pt/videos" --> url onde será feita a procura de vídeos
Mode = 1 --> modo seguinte
Thumbnail = "http://digitalsherpa.com/wp-content/uploads/2013/04/social-media-marketing-tool.png(uma imagem retirada da internet)

A função CATEGORIES() ficará então:

  
def CATEGORIES():
    addDir('VIDEOS','http://www.maisfutebol.iol.pt/videos',1,'http://digitalsherpa.com/wp-content/uploads/2013/04/social-media-marketing-tool.png')




Nota: O entalhe (indentation) é importante em python. Se reparerem a linha addDir difere horizontalmente da posição da linha inicial (def...).

Guardando o ficheiro e iniciando o addon no XBMC verificamos que já temos um menú...mas que ainda não faz nada.



O próximo passo será definir o modo 1!

MODO 1 - Criar a função listar_videos(url)

Olhando para o fim do script addon.py (em branco) temos:

  
elif mode==1:
      print ""

Ou seja, mais uma vez não temos nada definido. Quando o XBMC chega ao modo 1 limita-se a "imprimir"...nada. É nosso objectivo que, sempre que o XBMC esteja no modo 1 execute uma determinada função que use/leia como argumento o endereço que definimos há pouco aquando da criação do menu. Desta forma, vamos especificar que, quando no modo 1, o XBMC chame uma função chamada listar_videos(url).

  
elif mode==1:
      print ""
      listar_videos(url)

Não temos esta função definida no código, teremos de a criar.
Na parte que reservei para as funções a construir escrevam:

  
def listar_videos(url):

Esta é a forma correcta de definir uma função em python:

def (de definir) nome_da_função(argumentos):

Queremos que esta função abra o endereço url em causa e armazene o código-fonte da página. Podemos fazê-lo recorrendo à função abrir_url(url) que já está construída e se encontra na secção que reservei para as funções já feitas. Chamamos a função da seguinte forma:

codigo_fonte = abrir_url(url)

A função fica então:

def listar_videos(url):
     codigo_fonte = abrir_url(url)

Recapitulando. Quando clicámos no menu "VIDEOS", o XBMC passou para o modo 1 com a variável url que indicámos na criação do menu. Chegado ao modo 1, o XBMC chama a função listar_videos com a variavel url como argumento, que por sua vez chama a função abrir_url que usa essa variavel url tambem como argumento e armazena o codigo fonte da página na variavel codigo_fonte. Perceberam? Torna-se mais difícil explicar do que entender o funcionamento olhando para o código... :)

E o que é este codigo_fonte?

Se abrirem a página http://www.maisfutebol.iol.pt/videos no vosso browser e forem a ferramentas -> ver código fonte; esse será o "texto" que ficará guardado na variável codigo_fonte.


O próximo passo na construção da função é retirar desta variável codigo_fonte apenas a informação que pretendemos (o título dos vídeos, o endereço onde encontrar esses vídeos e os icons de cada vídeo (opcional).

Na pagina web, atentem no nome d primeiro vídeo. À data que escrevo este post, o primeiro vídeo listado chama-se "Guardiola em Munique....blablabla".


Procuremos essas palavras no código fonte apresentado no browser:


Facilmente chegamos à conclusão que o "estilo de código" presente no código fonte da página é idêntico para qualquer um dos vídeos, alterando-se apenas o nome, endereço e imagem (óptimo...trabalho facilitado). Temos ali toda a informação que queremos obter! O endereço da página onde está o vídeo (em href), a imagem (em img src) e o título (entre ><).

Ora reparem no trecho do código fonte do primeiro vídeo:

alt="Guardiola em Munique: «Uma honra imensa»" />Guardiola em Munique: «Uma honra imensa»<br /><em>2013-06-24</em></a></li>

Deste trecho do código fonte queremos fazer isto...

<li><a class="" href="(QUERO GUARDAR)"><span class="player"></span><img src="(QUERO GUARDAR)"
alt="(NÃO ME INTERESSA)" />(QUERO GUARDAR)<br /><em>(NAO ME INTERESSA)</em></a></li>

Para o fazer (em Python), recorremos à biblioteca re (importada logo no inicio do addon - import re – vejam as primeiras linhas do ficheiro). RE significa regular expressions.
É tão simples como substituir o (QUERO GUARDAR) por (.+?) e o NAO ME INTERESSA por apenas .+?

Desta forma, neste caso a regular expression é (atentar no paragrafo \n !):


<li><a class="" href="(.+?)"><span class="player"></span><img src="(.+?)"\n
alt=".+?" />(.+?)<br /><em>.+?</em></a></li>

Adicionemos então a seguinte linha à função:

match = re.compile('<li><a class="" href="(.+?)"><span class="player"></span><img src="(.+?)"\n alt=".+?" />(.+?)<br /><em>.+?</em></a></li>').findall(codigo_fonte)


A variável match será uma matriz da seguinte forma:

[(1º valor 1º entrada, 2 º valor 1º entrada, 3º valor 1º entrada),(1º valor 2º entrada, 2º valor 2º entrada, 3º valor, 2º entrada) ….........] , em que cada linha corresponde aos 3 valores (url,thumbnail e titulo) retirados de cada entrada idêntica ao trecho de código-fonte que analisámos...

Pretendemos seguidamente que exista um ciclo, um comando que seja chamado cada vez que for encontrada uma entrada deste género no código_fonte. Algo assim: 

Para entrada 1 (podemos-lhe chamar url), entrada 2 (pudemos-lhe chamar img), entrada 3 (podemos chamar-lhe titulo) na variavel match → adicionar um novo sub-menu que envie o xmbc para o modo seguinte (modo 2) com um novo URL (o url da página onde está o vídeo). Em Python, é quase traduzido à letra:


for url,img,titulo in match:
    addDir(titulo,'http://www.maisfutebol.iol.pt' + url,2,img)


Notar que o valor que fica na variável url é da forma /videos/video/13901725/1 quando o url correcto que o XBMC deverá abrir é http://www.maisfutebol.iol.pt/videos/video/13901725/1. Como tal, temos de adicionar a parte inicial manualmente!

A função listar_videos(url) já está completa. Fica definida da seguinte forma:

def listar_videos(url):
    codigo_fonte = abrir_url(url)
    match=re.compile('<li><a class="" href="(.+?)"><span class="player"></span><img src="(.+?)"\n alt=".+?" />(.+?)<br /><em>.+?</em></a></li>').findall(codigo_fonte)
    for url, img, titulo in match:
         addDir(titulo,'http://www.maisfutebol.iol.pt'+url,2,img)

Se salvarmos o ficheiro e entrarmos de novo no sub-menu 'VIDEOS', veremos que as entradas já se encontram listadas!





MODO 2 - Encontrar o endereço do vídeo e “entregar” ao XBMC:

Encontrar o endereço completo do caminho do ficheiro de vídeo nem sempre é fácil. Em primeiro lugar convém procurar no código fonte da página onde se encontra o vídeo por “.flv” ou “.mp4” que são as extensões de ficheiros de vídeo mais comuns ou por “rtmp” que é um dos protocolos de streaming mais usados.

Abram o url onde está o 1º vídeo (http://maisfutebol.iol.pt/videos/video/13901725/1) no browser e procurem por essas palavras: mp4, flv, rtmp, m3u8....

Neste caso, o stream de vídeo é rtmp, o que dificulta um pouco a tarefa...
No código fonte da página encontramos o seguinte:

content="https://www.iol.pt/flashplayers/jwplayer_5_9.swf?file=mp4%3A13901725-L-500k&amp;streamer=rtmp%3A%2F%2Fvideo1.iol.pt%2Fvod&amp;config=https%3A%2F%2Fwww.iol.pt%2Fconfig_fb.xml%3Fsite%3Dmaisfutebol%26scheme%3Dhttps" /><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

Apesar de grande parte da informação poder estar neste pedaço do código-fonte, raramente é tão linear. Aconselho-vos a usar as seguintes ferramentas para determinar este tipo de endereços: urlhelper (http://www.urlhelper.com/), streamtransport (http://www.streamtransport.com/), rtmpdump(http://rtmpdump.mplayerhq.hu/) ou wireshark (http://www.wireshark.org/).


O url final obtido no programa urlhelper é o seguinte:

rtmp://video1.iol.pt:80/vod/mp4:13901725-L-500k

Não era assim tão linear....
Ninguém garante que este endereço seja sempre idêntico. Basta o webmaster alterar o servidor (video1.iol.pt) ou a porta (80) e o addon deixará de funcionar. Imaginem que isso acontece todas as semanas. Já perceberam o primeiro parágrafo do tutorial? 

Aproveitemos no entanto a informação disponível no trecho anterior para construir o endereço final do vídeo. Tal e qual como fizemos há pouco:


match = re.compile('file=(.+?)&amp;streamer=(.+?)amp;config.+?\n.+?<meta http-equiv="X-UA-Compatible"').findall(codigo_fonte)


É importante substituir o “%3A” por “:” e o “%2F” por “/” para o endereço ficar correcto. Caso contrário teríamos:

mp4%3A13901725-L-500k e rtmp%3A%2F%2Fvideo1.iol.pt%2Fvod

Quando aquilo que desejamos é

mp4:13901725-L-500k e rtmp://video1.iol.pt/vod

A substituição é conseguida em Python fazendo: VARIAVEL.replace(“expressao antiga”,”expresao nova”).

A única “função já construída” do "addon em branco" que ainda não referi é a addLink. Serve para adicionar uma entrada ao menu do XBMC que corresponde a um ficheiro multimédia, tal que, quando a executamos, o XBMC começa a reproduzir o ficheiro. Podemos pensar na função addDir como a criação de uma “nova pasta” e a addLink como a criação de um “novo ficheiro” (multimédia).
Para adicionar um ficheiro multimédia (link) ao XBMC usamos a função: addLink(nome,url,iconImage).

Bem, chega de paleio, vamos construir a função.....

Comecemos por definir nos Modos, o modo 2 que chamará a função que desejarmos. Chamei-lhe encontrar_fontes(url).


elif mode==2:
      print ""
      encontrar_fontes(url)

...e definimos esta função de acordo com a informação apresentada acima outra cujo funcionamento já foi devidamente explicado neste tutorial.


def encontrar_fontes(url):
    codigo_fonte = abrir_url(url)
    match = re.compile('file=(.+?)&amp;streamer=(.+?)amp;config.+?\n.+?<meta http-equiv="X-UA-Compatible"').findall(codigo_fonte)
    for ficheiro, streamer in match:
        ficheiro = ficheiro.replace('%3A',':')
        streamer = streamer.replace('%3A',':')
        streamer = streamer.replace('%2F','/')
 #NOTA: nesta altura a variavel streamer é rtmp://video1.iol.pt/vod&
        match = re.compile('rtmp://(.+?)/(.+?)&').findall(streamer)
        for rtmp,app in match:
            addLink('Assistir Vídeo','rtmp://' + rtmp + ':80/' + app + '/' + ficheiro,'')

Se tudo correr bem...




Podes fazer o download do addon.py final aqui: 


Trabalho para casa :) :

- Adiciona a data ao menu dos vídeos
- Adiciona um sub-menu (addDir) de “Página seguinte” na listagem de vídeos
- Escapa o passo intermédio de “encontrar fontes” fazendo a “ponte” entre o modo 1 e o “addLink”.
- Tenta fazer o mesmo com outro site da tua preferência

Dúvidas ou questões coloquem de preferência no tópico dedicado a este post no fórum do blog: http://forum.aminhacasadigital.com/viewtopic.php?f=9&t=230


Espero ver o addon do Maisfutebol concluído por um de vocês brevemente :)


Até breve,

Miguel Borges de Freitas



39 Comments: