codebits `07

Transcrição

codebits `07
codebits ‘07
RSS
BIO
[email protected]
Eduardo Pinto
Developer SAPO desde 2000
DTP: Direcção de Tecnologia de Produto - Devel
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
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.
E no SAPO? Fazem alguma coisa nesse sentido?
1996
1995
1998
1997
2000
1999
2002
2001
2004
2003
2006
2005
2007
O SAPO mudou
Service centric
APIS abertas
OpenSource JSLib e Broker
Distribuir e transformar conteúdo
BUS
Broker
RSS
JSLib
Fast
Bus de Serviços SAPO
goes Public!
mashups de
novos serviços
BUS de
Serviços
serviços
serviços
serviços
RSS no SAPO
Exemplos em produção
Fotos
Desktop App: Uploader
Blogs,Video, Pesquisa, Fotos
Accuweather, Mapas, Lusa, SIC
Podcasts, TeK, Jornais Regionais
etc...
SOAP / Rest
RSS / XML / JSON
Local e Notícias
Spot
Blogs, Fotos,Videos, Messenger
FlickR, etc
php, perl, python, c#, delphi, erlang, c++
Tempo
Farmácias
SAPO Mapas
Homepage
Mail, Messenger, Astrologia
Trânsito, Tempo, Fotos, Blogs, Tags
Flash
Accuweather
developer.sapo.pt
trac.softwarelivre.sapo.pt
P2
RSS, GeoRSS e Tools
RSS: real simple syndication?
RDF
0.90
Rich Site Summary
0.91
0.92
0.93
0.94
1.0
RDF Site Summary
Spin-off da Userland
2.0
Real Simple Syndication
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>
Geo RSS
Existem pelo menos 3 standards, alguns com variações.
Simple
<georss:point>45.256 -71.92</georss:point>
GML
W3C Geo
<georss:where>
<gml:Point>
<gml:pos>45.256 -71.92</gml:pos>
</gml:Point>
<geo:Point>
<geo:lat>55.701</geo:lat>
<geo:long>12.552</geo:long>
</geo:Point>
</georss:where>
<geo:lat>26.58</geo:lat>
<geo:long>-97.83</geo:long>
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.
<?php
require 'magpie/rss_fetch.inc';
$bancaRSS = ‘http://umUrlqualquer’;
$banca = fetch_rss($bancaRSS);
$bancaItems = $banca->items;
foreach($bancaItems as $b => $i) {
$titulo = $i[‘title’]
bla bla...
e talvez mesmo Atom
#!/usr/bin/env python
import feedparser
d = feedparser.parse("http://Url")
d['feed']['title']
http://magpierss.sourceforge.net/
#!/usr/bin/perl
use XML::RSS::Parser::Lite;
use LWP::Simple;
my $xml = get("http://url.to.rss");
my $rp = new
XML::RSS::Parser::Lite;
$rp->parse($xml);
print $rp->get('title');
http://search.cpan.org/~ebosrup/RSS-Parser-Lite-0.10/
http://feedparser.org/index.html
using System;
using System.Runtime.InteropServices;
using Microsoft.Feeds.Interop;
namespace RSSClient
{
class Program
{
static void Main(string[] args)
{
IFeedsManager manager = new
FeedsManagerClass();
IFeed feed = (IFeed)
manager.GetFeedByUrl("http://services.sapo.pt/
Metadata/RSS/");
foreach (IFeedItem item in
(IFeedsEnum)feed.Items)
{
Console.WriteLine(item.Title);
}
Console.ReadLine();
}
}
}
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
...
Demo
Do jornal ao Coverflow
Objectivo:
Tools
XML
KISS mode. Um script e dois outputs
Aceder ao link do
jornal
hack it:
Scrape para RSS
Banca de Jornais
(sem feed, dumb page)
RSS auto
discovery
Página de Jornal
(tem imagem e link do jornal)
Sacar imagem da primeira
página
.pt | .br
XML Flash
XML
Podcast
TEXT
TEXT-TOSPEECH
AIFF
MP3
iTunes
Flash Web
Coverflow
iTouch
Coverflow
Tag + Embed
APIC
1. Se não tens RSS, “arranja-o”
http://www.feedity.com/?http://noticias.sapo.pt/banca2
hack it:
Scrape para RSS
Banca de Jornais
(sem feed, dumb page)
Página de Jornal
Gerador
dee link
RSS
(tem imagem
do para
jornal)
páginas web sem feeds
Encontra padrões nas páginas e produz items de RSS.
Actualização em tempo real
Sacar imagem
da primeira
Ajuste
manual
dos resultados produzidos.
página
XML Flash
XML
Podcast
iTunes
Flash Web
Coverflow
iTouch
Coverflow
TEXT
Output: RSS 2.0 Feed
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<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>
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="(\S+)"
target="_new">\s+<img src="(.+)"/',
$s,$matches);
$url = $matches[1];
$coverUrl = $matches[2];
URL do Jornal
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="alternate" type="application/rss+xml"
title="RSS" 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="(\S+)"/i',$o,$matches);
$rssFeed = $matches[1];
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="date" content="2007-11-11 01:00:00">
<title>Jornal de Not&iacute;cias - Capa JN Domingo, 11 de Novembro
de 2007</title>
<link rel="alternate" type="application/rss+xml" title="JN:
&Uacute;ltima Hora em RSS" href="http://services.sapo.pt/RSS/Feed/
noticias/sapo_noticias/jornal_de_noticias" />
<link href="http://jn.sapo.pt/css/lusomundo/jn/jn.css"
rel="stylesheet" type="text/css">
<base href="http://jn.sapo.pt/">
<link rel="stylesheet" type="text/css" href="http://imgs.sapo.pt/
css/lusomundo/jn/sp_menu.css">
</head>
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)
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
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
6. Converter em MP3
No brainer.
LAME MP3 encoder
$cmdline = "/opt/local/bin/lame --add-id3v2 --tt \"$title\" --ta
\"SAPO\" --ignore-tag-errors --silent $audioStore/$audio $audioStore/
$audio.mp3";
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 = "/usr/local/bin/eyeD3 --no-color --add-image=
$coverStore/$cover:FRONT_COVER $audioStore/$audio.mp3";
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="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
<channel>
<title>All About Everything</title>
<link>http://www.example.com/podcasts/everything/index.html</link>
<language>en-us</language>
<copyright>&#x2117; &amp; &#xA9; 2005 John Doe &amp; 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>[email protected]</itunes:email>
</itunes:owner>
<itunes:image href="http://example.com/podcasts/everything/AllAboutEverything.jpg" />
<itunes:category text="Technology">
<itunes:category text="Gadgets"/>
</itunes:category>
<itunes:category text="TV &amp; Film"/>
<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="http://example.com/podcasts/everything/AllAboutEverythingEpisode3.m4a" length="8727310"
type="audio/x-m4a" />
<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>
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.
9. Subscribe, Sync, Play!
Live Demo
...
10. XML Flash Coverflow
Live Demo
Sugestões
para projectos no codebits
microformats
(Operator toolbar Firefox)
customer care
ouvir os utilizadores
e interagir com eles
mapas
tags
Extracção de informação geográfica
a partir de um texto
cam API
um jogo ?
passionate users
codebits ‘07
exit()
Samples e referências online na intra