Rss

Post on 26-Jun-2015

2.152 views 0 download

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

BIO

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

eep@co.sapo.pt

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

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?

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?

RSS no SAPO

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

developer.sapo.pttrac.softwarelivre.sapo.pt

P2

RSS, GeoRSS e Tools

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

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.

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>

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

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

...

DemoDo jornal ao Coverflow

Objectivo:

Tools

XML

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

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.

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

<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

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>

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)

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

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

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

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

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>john.doe@example.com</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 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.

9. Subscribe, Sync, Play!

Live Demo

...

10. XML Flash Coverflow

Live Demo

Sugestõespara projectos no codebits

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 ?

exit()

codebits ‘07

Samples e referências online na intra