Rss

36
RSS codebits ‘07

description

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.

Transcript of Rss

Page 2: Rss

BIO

Eduardo PintoDeveloper SAPO desde 2000DTP: Direcção de Tecnologia de Produto - Devel

[email protected]

Page 3: Rss

45m Parte 1 (10 min)

O Bus e outros brinquedosIntro

RSS no SAPO. O que há?Parte 2 (10 min)

RSSGeoRSSFerramentas úteis

Parte 3 (25 min)

Do jornal ao CoverflowSugestões para o concurso

Page 4: 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.

Porque é que o utilizador comum ainda não sabe o que é o RSS?

Page 5: Rss

1995 1997 1999 2001 2003 2005

1996 1998 2000 2002 2004 2006

2007

O SAPO mudouBus de Serviços SAPO

goes Public!

BUS deServiços

serviços serviços serviços

mashups de novos serviços

Service centricAPIS abertasOpenSource JSLib e BrokerDistribuir e transformar conteúdo

BUS

Fast

Broker

JSLibRSS

E no SAPO? Fazem alguma coisa nesse sentido?

Page 6: Rss

RSS no SAPO

Page 7: Rss

Exemplos em produção

Homepage Mail, Messenger, AstrologiaTrânsito, Tempo, Fotos, Blogs, Tags

Tempo FlashAccuweather

Farmácias SAPO Mapas

Local e NotíciasBlogs, Video, Pesquisa, FotosAccuweather, Mapas, Lusa, SICPodcasts, TeK, Jornais Regionaisetc...

Spot Blogs, Fotos, Videos, MessengerFlickR, etcFotos Desktop App: Uploader

SOAP / RestR

SS / XM

L / JSON

php, perl, python, c#, delphi, erlang, c++

Page 8: Rss

developer.sapo.pttrac.softwarelivre.sapo.pt

Page 9: Rss

P2

RSS, GeoRSS e Tools

Page 10: Rss

RSS: real simple syndication?

0.900.91

0.920.930.94

1.0

2.0Rich Site Summary

RDF

RDF Site Summary

Real Simple Syndication

Spin-off da Userland

Page 11: Rss

Geo RSS

<geo:lat>38.7376</geo:lat><geo:long>-9.12403</geo:long>

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.

Page 12: Rss

Geo RSS

W3C Geo

Existem pelo menos 3 standards, alguns com variações.

<geo:Point> <geo:lat>55.701</geo:lat> <geo:long>12.552</geo:long></geo:Point>

<geo:lat>26.58</geo:lat> <geo:long>-97.83</geo:long>

GMLSimple<georss:where> <gml:Point> <gml:pos>45.256 -71.92</gml:pos> </gml:Point>

</georss:where>

<georss:point>45.256 -71.92</georss:point>

Page 13: Rss

RSS ToolsHá dezenas de classes e toolkits para fazer parsing de RSSNinguém precisa de mais uma!

<?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...

#!/usr/bin/env python

import feedparserd = feedparser.parse("http://Url")d['feed']['title']

http://feedparser.org/index.html

http://magpierss.sourceforge.net/

Assegurem-se que tem suporte para RSS 2.0 e 0.92.

e talvez mesmo Atom

#!/usr/bin/perluse 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/

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();         }     } }

Page 14: Rss

Ferramentas para MashupsHá imensas ferramentas de mashups na webfeedity.com - criar RSS a partir de páginas Webplagger.org - criar RSS a partir de outros RSS

Page 15: Rss

...

Page 16: Rss

DemoDo jornal ao Coverflow

Page 17: Rss

Objectivo:

Page 18: Rss

Tools

XML

Page 19: Rss

Banca de Jornais(sem feed, dumb page)

hack it:Scrape para RSS

Página de Jornal(tem imagem e link do jornal)

Sacar imagem da primeira página

Aceder ao link do jornal

RSS auto discovery

.pt | .br

AIFF

MP3

Tag + Embed APIC

XML Flash

XML Podcast

TEXTTEXT-TO-SPEECH

iTunes

iTouch Coverflow

Flash Web Coverflow

KISS mode. Um script e dois outputs

Page 20: Rss

Banca de Jornais(sem feed, dumb page)

hack it:Scrape para RSS

Página de Jornal(tem imagem e link do jornal)

Sacar imagem da primeira página

Aceder ao link do jornal

RSS auto discovery

.pt | .br

AIFF

MP3

Tag + Embed APIC

XML Flash

XML Podcast

TEXTTEXT-TO-SPEECH

iTunes

iTouch Coverflow

Flash Web Coverflow

http://www.feedity.com/?http://noticias.sapo.pt/banca2

1. Se não tens RSS, “arranja-o”

Gerador de RSS para páginas web sem feedsEncontra padrões nas páginas e produz items de RSS.Actualização em tempo realAjuste manual dos resultados produzidos.

Page 21: Rss

<?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>

Output: RSS 2.0 Feed

Page 22: Rss

<link>http://noticias.sapo.pt/banca2/jornal/?jornal=Jornal+de+Not%C3%ADcias++++</link>

URL do Jornal

JPEG da imagem

2. Obter imagem da capa e URL do jornal

// Extract newspaper URL and cover

preg_match('/href="(\S+)" target="_new">\s+<img src="(.+)"/',$s,$matches);

$url = $matches[1];$coverUrl = $matches[2];

Expressão regular para encontrar

Page 23: Rss

3. Obter feed de RSS do jornal.

if(stristr($o, 'alternate') && stristr($o,'rss')) {preg_match('/href="(\S+)"/i',$o,$matches);$rssFeed = $matches[1];

Os feeds são declarados na secção HEAD das páginasO 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 porocorrências de alternate e rss.Depois, usamos uma expressão regular para obter o URL do feed

<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>

Page 24: Rss

4. Parse do feed de RSS do jornalQueremos 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.

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 seriamuito bom :)

$tts = html_entity_decode($tts,ENT_QUOTES);$tts = strip_tags($tts);

// Paranoid$tts = utf8_encode($tts);

preg_match('/\.pt|blogspot\.com|\.com\.br|cabra|uniao|alentejo/',$url)

Page 25: Rss

5. Text-To-Speech (TTS)Utilizadores de Mac OSX

InfoVox iVoxhttp://assistiveware.com/infovox_ivox.php

Boa implementação do português de Portugal.A versão de trial dura bastante tempo e integra muito bemcom 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

Page 26: Rss

5. Text-To-Speech (TTS)Utilizadores de Mac OSX

InfoVox iVoxhttp://assistiveware.com/infovox_ivox.php

Boa implementação do português de Portugal.A versão de trial dura bastante tempo e integra muito bemcom 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

Page 27: Rss

6. Converter em MP3No brainer.

LAME MP3 encoder

$cmdline = "/opt/local/bin/lame --add-id3v2 --tt \"$title\" --ta \"SAPO\" --ignore-tag-errors --silent $audioStore/$audio $audioStore/$audio.mp3";

Page 28: Rss

7. Embedded tag: APIC

O XML de definição do podcast apenas permite uma imagempor 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";

Page 29: Rss

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>

Page 30: Rss

Usámos RSS certo?Ao gerar um feed de uma página que não tinhaPara informar o iTunes que havia novos podcasts

e no entanto...

Em nenhum momento o utilizador leu a palavra RSS ou tevede lidar com o conceito.

Page 31: Rss

9. Subscribe, Sync, Play!

Live Demo

Page 32: Rss

...

Page 33: Rss

10. XML Flash Coverflow

Live Demo

Page 34: Rss

Sugestõespara projectos no codebits

Page 35: Rss

microformats(Operator toolbar Firefox)

Extracção de informação geográficaa partir de um texto

customer careouvir os utilizadorese interagir com eles

passionate users

mapastags

cam APIum jogo ?

Page 36: Rss

exit()

codebits ‘07

Samples e referências online na intra