O RSS é o XML democrata e grande responsável pela revolução dos conteúdos. Está em todo o lado. O SAPO serve já dezenas de feeds de conteúdos e serviços com suporte Opensearch.
Neste workshop iremos partir de uma página web estática, chata e sem côr para criar uma aplicação multimedia e um serviço.
Pelo caminho estará muito RSS e muita transformação de conteúdo.
Para o final guardam-se algumas sugestões para os concorrentes ao Codebits '07.
2. BIO
eep@co.sapo.pt
Eduardo Pinto
Developer SAPO desde 2000
DTP: Direcção de Tecnologia de Produto - Devel
3. 45m Parte 1 (10 min)
Intro
O Bus e outros brinquedos
RSS no SAPO. O que há?
Parte 2 (10 min)
RSS
GeoRSS
Ferramentas úteis
Parte 3 (25 min)
Do jornal ao Coverflow
Sugestões para o concurso
4. Porque é que o utilizador comum ainda não sabe o
que é o RSS?
Pela mesma razão que não sabe o que é HTML. É irrelevante
enquanto não for “renderizado” de forma prática.
RSS é um instrumento. Uma ferramenta. Não é um serviço.
O RSS por si só não significa nada.
Ser informado sobre novos posts num blog, já tem significado palpável
Desistam de tentar evangelizar os utilizadores para o RSS.
Insistam em evangelizar os programadores para o uso do RSS como
forma simples de manipular dados ubíquos.
Insistam em convencer os arquitectos a esconder o RSS e
transformá-lo um instrumento de magia.
Os browsers recentes parecem ter aprendido essa lição.
5. E no SAPO? Fazem alguma coisa nesse sentido?
1996 1998 2000 2002 2004 2006
2007
2005
1995 1997 1999 2001 2003
O SAPO mudou
Bus de Serviços SAPO
Service centric
goes Public!
APIS abertas mashups de
OpenSource JSLib e Broker novos serviços
Distribuir e transformar conteúdo
BUS de
BUS Broker
Serviços
RSS JSLib
Fast serviços serviços serviços
10. RSS: real simple syndication?
0.92
0.91 0.93 2.0
RDF
0.90 0.94 Real Simple Syndication
Rich Site Summary
1.0
RDF Site Summary
Spin-off da Userland
11. Geo RSS
Permite detalhar um ponto, linha, polígono, rectângulo,
elevação, raio, etc.
As aplicações de Mapas já são capazes de interpretar o
formato via RSS e apresentar graficamente a
informação.
<geo:lat>38.7376</geo:lat>
<geo:long>-9.12403</geo:long>
12. Geo RSS
Existem pelo menos 3 standards, alguns com variações.
Simple GML W3C Geo
<georss:where> <geo:Point>
<georss:point>45.256 -71.92</georss:point>
<gml:Point> <geo:lat>55.701</geo:lat>
<gml:pos>45.256 -71.92</gml:pos> <geo:long>12.552</geo:long>
</gml:Point> </geo:Point>
</georss:where> <geo:lat>26.58</geo:lat>
<geo:long>-97.83</geo:long>
13. RSS Tools
Há dezenas de classes e toolkits para fazer parsing de RSS
Ninguém precisa de mais uma! Assegurem-se que tem suporte
para RSS 2.0 e 0.92.
e talvez mesmo Atom
<?php
require 'magpie/rss_fetch.inc';
#!/usr/bin/env python
$bancaRSS = ‘http://umUrlqualquer’;
$banca = fetch_rss($bancaRSS); import feedparser
$bancaItems = $banca->items; d = feedparser.parse(quot;http://Urlquot;)
d['feed']['title']
foreach($bancaItems as $b => $i) {
http://feedparser.org/index.html
$titulo = $i[‘title’]
bla bla...
using System;
http://magpierss.sourceforge.net/ using System.Runtime.InteropServices;
using Microsoft.Feeds.Interop;
namespace RSSClient
{
class Program
{
static void Main(string[] args)
#!/usr/bin/perl {
use XML::RSS::Parser::Lite; IFeedsManager manager = new
use LWP::Simple; FeedsManagerClass();
IFeed feed = (IFeed)
manager.GetFeedByUrl(quot;http://services.sapo.pt/
my $xml = get(quot;http://url.to.rssquot;); Metadata/RSS/quot;);
my $rp = new foreach (IFeedItem item in
XML::RSS::Parser::Lite; (IFeedsEnum)feed.Items)
$rp->parse($xml); {
Console.WriteLine(item.Title);
}
print $rp->get('title'); Console.ReadLine();
}
}
}
http://search.cpan.org/~ebosrup/RSS-Parser-Lite-0.10/
14. Ferramentas para Mashups
Há imensas ferramentas de mashups na web
feedity.com - criar RSS a partir de páginas Web
plagger.org - criar RSS a partir de outros RSS
19. KISS mode. Um script e dois outputs
Aceder ao link do
jornal
hack it: Banca de Jornais RSS auto
Scrape para RSS (sem feed, dumb page) discovery
Página de Jornal
.pt | .br
(tem imagem e link do jornal)
Sacar imagem da primeira TEXT-TO-
TEXT
página SPEECH
XML Flash
AIFF
XML
Podcast
MP3
iTunes
Tag + Embed
APIC
Flash Web iTouch
Coverflow Coverflow
20. 1. Se não tens RSS, “arranja-o”
http://www.feedity.com/?http://noticias.sapo.pt/banca2
hack it: Banca de Jornais
Scrape para RSS (sem feed, dumb page)
Página de Jornal
Gerador de link do para
(tem imagem e RSS jornal)páginas web sem feeds
Encontra padrões nas páginas e produz items de RSS.
Actualização em tempo real
Ajuste imagem da primeira
Sacar manual dos resultados produzidos.
TEXT
página XML Flash
XML
Podcast
iTunes
Flash Web iTouch
Coverflow Coverflow
21. Output: RSS 2.0 Feed
<?xml version=quot;1.0quot; encoding=quot;utf-8quot;?>
<rss version=quot;2.0quot;>
<channel>
<title>SAPO Notícias - Banca de Jornais</title>
<link>http://noticias.sapo.pt/banca2</link>
<description>RSS Web Feed for SAPO Notícias - Banca de Jornais (Generated by Feedity.com)
</description>
<generator>Feedity/1.6 (+http://www.feedity.com)</generator>
<pubDate>Sun, 11 Nov 2007 18:39:25 GMT</pubDate>
<lastBuildDate>Sun, 11 Nov 2007 18:39:25 GMT</lastBuildDate>
<image>
<title>Generated by Feedity.com</title>
<url>http://www.feedity.com/images/feedity_feed_logo-small.gif</url>
<link>http://noticias.sapo.pt/banca2</link>
</image>
<ttl>30</ttl>
<item>
<title>Jornal de Notícias</title>
<link>http://noticias.sapo.pt/banca2/jornal/?jornal=Jornal+de+Not%C3%ADcias++++</link>
<guid>http://noticias.sapo.pt/banca2/jornal/?jornal=Jornal+de+Not%C3%ADcias++++</guid>
<description>Jornal de Notícias</description>
</item>
<item>
<title>24 Horas</title>
<link>http://noticias.sapo.pt/banca2/jornal/?jornal=24+Horas</link>
<guid>http://noticias.sapo.pt/banca2/jornal/?jornal=24+Horas</guid>
<description>24 Horas</description>
</item>
22. 2. Obter imagem da capa e URL do jornal
<link>http://noticias.sapo.pt/banca2/jornal/?jornal=Jornal+de+Not%C3%ADcias++++</link>
JPEG da imagem
Expressão regular para encontrar
// Extract newspaper URL and cover
preg_match('/href=quot;(S+)quot;
target=quot;_newquot;>s+<img src=quot;(.+)quot;/',
$s,$matches);
$url = $matches[1];
$coverUrl = $matches[2];
URL do Jornal
23. 3. Obter feed de RSS do jornal.
Os feeds são declarados na secção HEAD das páginas
O formato da declaração é simples:
<link rel=quot;alternatequot; type=quot;application/rss+xmlquot;
title=quot;RSSquot; href=”http://umURL”>
Obtemos as primeiras linhas (<20 deve ser suficiente) e procuramos por
ocorrências de alternate e rss.
Depois, usamos uma expressão regular para obter o URL do feed
if(stristr($o, 'alternate') && stristr($o,'rss')) {
preg_match('/href=quot;(S+)quot;/i',$o,$matches);
$rssFeed = $matches[1];
<head>
<meta http-equiv=quot;Content-Typequot; content=quot;text/html; charset=utf-8quot;>
<meta name=quot;datequot; content=quot;2007-11-11 01:00:00quot;>
<title>Jornal de Notícias - Capa JN Domingo, 11 de Novembro
de 2007</title>
<link rel=quot;alternatequot; type=quot;application/rss+xmlquot; title=quot;JN:
Última Hora em RSSquot; href=quot;http://services.sapo.pt/RSS/Feed/
noticias/sapo_noticias/jornal_de_noticiasquot; />
<link href=quot;http://jn.sapo.pt/css/lusomundo/jn/jn.cssquot;
rel=quot;stylesheetquot; type=quot;text/cssquot;>
<base href=quot;http://jn.sapo.pt/quot;>
<link rel=quot;stylesheetquot; type=quot;text/cssquot; href=quot;http://imgs.sapo.pt/
css/lusomundo/jn/sp_menu.cssquot;>
</head>
24. 4. Parse do feed de RSS do jornal
Queremos o <description> dos items de notícias. 3 items chegam para o exemplo.
Atenção ao encoding. Nem todos seguem as boas práticas. Há feeds declarados
como UTF-8 que na realidade chegam em Latin-1 e cheios de HTML entities.
$tts = html_entity_decode($tts,ENT_QUOTES);
$tts = strip_tags($tts);
// Paranoid
$tts = utf8_encode($tts);
O Text-to-Speech que vamos usar usa a língua portuguesa.
Verificar o TLD (.pt | .br). Um serviço de detecção com base no conteúdo seria
muito bom :)
preg_match('/.pt|blogspot.com|.com.br|cabra|uniao|alentejo/',$url)
25. 5. Text-To-Speech (TTS)
Utilizadores de Mac OSX
InfoVox iVox
http://assistiveware.com/infovox_ivox.php
Boa implementação do português de Portugal.
A versão de trial dura bastante tempo e integra muito bem
com o sistema operativo.
$cmdline = '/usr/bin/say -o '.$audioStore. '/' . $audio .' -f '.
$textStore . '/' . $text;
“Este conversor de texto para voz, funciona bastante
bem. É mesmo catita!”
Gera um ficheiro no formato AIFF
26. 5. Text-To-Speech (TTS)
Utilizadores de Mac OSX
InfoVox iVox
http://assistiveware.com/infovox_ivox.php
Boa implementação do português de Portugal.
A versão de trial dura bastante tempo e integra muito bem
com o sistema operativo.
$cmdline = '/usr/bin/say -o '.$audioStore. '/' . $audio .' -f '.
$textStore . '/' . $text;
“Este conversor de texto para voz, funciona bastante
bem. É mesmo catita!”
Gera um ficheiro no formato AIFF
28. 7. Embedded tag: APIC
O XML de definição do podcast apenas permite uma imagem
por feed.
O iTunes, no entanto, reconhece a tag APIC aplicada
individualmente a cada MP3 do podcast. É o que
habitualmente identificamos como artwork de uma música.
APIC (attached picture): faz parte da norma ID3v2.
A imagem é embebida no ficheiro de áudio.
http://www.id3.org/id3v2.4.0-frames
$cmdline = quot;/usr/local/bin/eyeD3 --no-color --add-image=
$coverStore/$cover:FRONT_COVER $audioStore/$audio.mp3quot;;
29. 8. Formato de Podcast do iTunes
É simplesmente um formato RSS 2.0 com extensões próprias
do iTunes (categoria, imagens, subtítulo, etc)
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<rss xmlns:itunes=quot;http://www.itunes.com/dtds/podcast-1.0.dtdquot; version=quot;2.0quot;>
<channel>
<title>All About Everything</title>
<link>http://www.example.com/podcasts/everything/index.html</link>
<language>en-us</language>
<copyright>℗ & © 2005 John Doe & Family</copyright>
<itunes:subtitle>A show about everything</itunes:subtitle>
<itunes:author>John Doe</itunes:author>
<itunes:summary>All About Everything is blabla</itunes:summary>
<description>All About Everything is blabla</description>
<itunes:owner>
<itunes:name>John Doe</itunes:name>
<itunes:email>john.doe@example.com</itunes:email>
</itunes:owner>
<itunes:image href=quot;http://example.com/podcasts/everything/AllAboutEverything.jpgquot; />
<itunes:category text=quot;Technologyquot;>
<itunes:category text=quot;Gadgetsquot;/>
</itunes:category>
<itunes:category text=quot;TV & Filmquot;/>
<item>
<title>Shake Shake Shake Your Spices</title>
<itunes:author>John Doe</itunes:author>
<itunes:subtitle>A short primer on table spices</itunes:subtitle>
<itunes:summary>This week we talk about bla bla</itunes:summary>
<enclosure url=quot;http://example.com/podcasts/everything/AllAboutEverythingEpisode3.m4aquot; length=quot;8727310quot;
type=quot;audio/x-m4aquot; />
<guid>http://example.com/podcasts/archive/aae20050615.m4a</guid>
<pubDate>Wed, 15 Jun 2005 19:00:00 GMT</pubDate>
<itunes:duration>7:04</itunes:duration>
<itunes:keywords>salt, pepper, shaker, exciting</itunes:keywords>
</item>
30. Usámos RSS certo?
Ao gerar um feed de uma página que não tinha
Para informar o iTunes que havia novos podcasts
e no entanto...
Em nenhum momento o utilizador leu a palavra RSS ou teve
de lidar com o conceito.
35. microformats
(Operator toolbar Firefox)
customer care
ouvir os utilizadores
e interagir com eles
mapas
tags
Extracção de informação geográfica
passionate users
a partir de um texto
cam API
um jogo ?
36. codebits ‘07
exit()
Samples e referências online na intra