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ícias - Capa JN Domingo, 11 de Novembro de 2007</title> <link rel="alternate" type="application/rss+xml" title="JN: Ú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>℗ & © 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>[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 & 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