(转帖)什么是Podcast?

转自:http://tech.blogchina.com/140/2005-04-14/364318.html

在rss相关名词中,我发现podcast出现的频率非常之高,但不知道是什么意思,现在看来,好像就是资源的个性聚合,例如:把其它任意多个blog的相关链接合在一起,形成自己需要的。也不知道正不正确。

                          正文

×××××××××××××××××××××××××××××××××××××××××××××××××××

您的位置: 博客网 -> 科技频道 -> 社会软件什么是Podcast?

作者:郑雅钦 | 2005年04月14日 20:04 | 原始出处: 博客中国    【内容提要】:  Podcast,中文译名尚未统一,但最多的是将其翻译为“播客”。它是数字广播技术的一种,出现初期借助一个叫“iPodder”的软件与一些便携播放器相结合而实现。Podcasting录制的是网络广播或类似的网络声讯节目,网友可将网上的广播节目下载到自己的iPod、MP3播放器或其它便携式数码声讯播放器中随身收听,不必端坐电脑前,也不必实时收听,享受随时随地的自由。更有意义的是,你还可以自己制作声音节目,并将其上传到网上与广大网友分享。

    就像博客颠覆了被动接受文字信息的方式一样,播客颠覆了被动收听广播的方式,使听众成为主动参与者。有人说,播客可能会像博客(Blog)一样,带来大众传媒的又一场革命。 

   关于Podcast的定义目前仍在争论中,比较有代表性的说法有以下三种:

   一.Podcast的推动者Doc Searls给出的定义:

   PODcasting,Personal Optional Digital casting。PODcasting是自助广播,是全新的广播形式。收听传统广播时我们是被动收听我们可能想听的节目,而PODcasting则是我们选择收听的内容、收听的时间以及以何种方式让其他人也有机会收听。 戴维·温纳(Dave Winer)的Morning Coffee Notes:人各有所专,所以理论上人人播客是可能的。

  二.Dave Shusher在其“Podcasting的定义”一文中的定义:

    他提出Podcasting必须具备三个要件:

    1.必须是一个独立的、可下载的媒体文件;

    2.该文件的发布格式为RSS2.0 enclosure feed;

    3.接收端能自动接收、下载并将文件转至需要的地方,放置于播放器的节目单中。

   他认为可下载MP3 不是波刻(Podcast)――这是充分但不是必要条件。“能下载固然不错,但能自动出现供你播放而无需你关照才是关键。这才是Podcasting。”

    三.Wikipedia的定义:

    像WIKI这样的定义是开放、动态的,到2004年12月13日为止,其定义为:      Podcasting源于iPod,兼具broadcasting和webcasting 之意。Podcasting 与TiVo相似, 只是Podcasting是用于声讯节目而且目前免费。但是应该注意,该技术能把任何文件“拉”过来,包括软件更新、照片和视频。

【 收藏此页到博采| 推荐给朋友 | 大 中 小 | 打印本文 | 关闭本页】

【郑重声明】博客网刊载此文不代表同意其说法或描述,仅为提供更多信息,也不构成任何投资或其他建议。转载需经博客网同意并注明出处。本网站有部分文章是由网友自由上传。对于此类文章本站仅提供交流平台,不为其版权负责。如果您发现本网站上有侵犯您的知识产权的文章,请联系我们

【本文网址】http://tech.bokee.com/140/2005-04-14/364318.html

rsslibj生成rss2.0搞不定,换了rome0.8来试试

  在rsslibj中生成rss2.0用getFeed("2.0")用下载的binary不行,用cvs库中的文件更不行,老是报告nullpoint错误,而且,文档和源程序混乱。

  试用了rome,感觉更正规一些,文档丰富,设计上好像要全面一些。毕竟,它是后来者,而rsslibj在2003年就停止发布了。

  rome自身带的例子已经比较全面,可以来它来写出基本功能的rss文件,下面附网上一篇完整的例子:

转自:http://kb.csdn.net/java/Articles/200512/10b9356d-85cd-4fe0-b8ae-3eece6cdb928.html

How To Generate RSS With ROME

作者: ∣来源:JavaLobby∣原文地址∣2005-12-30

Many people have asked how I implemented RSS in Fatima (JavaPress) on Java.net since the object model for Suns Rome API is a little.. dense, and suited more for abstract aggregation in your applications like Technorati. However, Rome is extremely powerful and offers lots of transformation and organization of your RSS feeds (no matter if you generate them or you grab them). Well, below is a general class that implements everything you would need to start generating your own RSS feeds using the ROME API, and for everyone that wants to get started quick this example should help you out.

doSyndication() is where youll want to focus your attention.

NOTE: This generates both regular RSS and shows you how to generate RSS with the embed tag for Podcasts!

package net.thepostmodern.fatima.rss;

 

import com.sun.syndication.feed.synd.*;

import com.sun.syndication.io.SyndFeedOutput;

import java.io.FileWriter;

import java.io.Writer;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.List;

import java.sql.*;

 

import net.thepostmodern.fatima.blog.*;

import net.thepostmodern.fatima.sql.ConnectionFactory;

 

 

/**

 * @author   bbjwerner

 */

public class GenerateRSS {

private static final DateFormat DATE_PARSER = new SimpleDateFormat("yyyy-MM-dd");

private static String fileName = null;

private static String feedType = null;

    private final List entries = new ArrayList();

private final List categories = new ArrayList();

    SyndEntry entry;

    SyndContent description;

SyndCategory category;

 

/**

* This method generates a seperate RSS feed for all categories in blog

* @param feedType The type of feed you wish to generate (RSS2.0, atom, ect.).

* @param fileName Filename will be category.xml, and this entry does nothing to override this.

*/

public void generateCategoryRSS(String Type, String Name) {

feedType = Type;

fileName = Name;

populateCategoryArray();

}

/**

* This method generates the RSS feeds for a complete blog with categories

* @param Type The type of feed you wish to generate (RSS2.0, atom, ect.).

* @param Name The filename to write out the format to.

*/

public void generateBlogRSS(String Type, String Name) {

feedType = Type;

fileName = Name;

this.populateArray();

}

       

        /**

* This method generates the RSS feeds for podcasting based on category (i.e. Podcast)

* @param Category The category to run as containing podcast content.

* @param Name The filename to write out the format to.

*/

        public void generatePodcastRSS(String Category, String Name) {

feedType = "rss2.0";

fileName = Name;

this.populatePodcastArray(Category);

}

public GenerateRSS() {

   

}

private void populateArray() {

 

    final ConnectionFactory thisFactory = new ConnectionFactory();

ResultSet blogEntries = null;

ResultSet blogInfo = null;

    try {

blogEntries = thisFactory.executeStatement("SELECT * FROM blog_entry ORDER BY id DESC");

blogInfo = thisFactory.executeStatement("SELECT * FROM blog_info");

blogEntries.first();

blogInfo.first();

while (!blogEntries.isAfterLast()) {

   

  this.addEntry(blogEntries.getString("title"),blogInfo.getString("url") + "/blog/BlogEntry.jsp?id=" + blogEntries.getString("id"), blogEntries.getString("date"), blogEntries.getString("teaser"), CategoryBean.getCategory(blogEntries.getString("category")), blogEntries.getString("author"));

  blogEntries.next();

}

this.doSyndication(blogInfo.getString("name"), blogInfo.getString("url") + "/blog", blogInfo.getString("description"), blogInfo.getString("copyright"),fileName);

System.out.println("Did Syndication");

}

catch (Exception ex) {

System.out.println("SQLException: " + ex.getMessage());

}

finally {

   

    try {blogEntries.close(); } catch (Exception ex) { System.out.println("SQLException: " + ex.getMessage()); }

    try {blogInfo.close(); } catch (Exception ex) { System.out.println("SQLException: " + ex.getMessage()); }

    thisFactory.Close();

}

}

private void populateCategoryArray() {

 

    final ConnectionFactory thisFactory = new ConnectionFactory();

ResultSet blogEntries = null;

ResultSet blogInfo = null;

ResultSet blogCategories = null;

try {

blogCategories = thisFactory.executeStatement("SELECT * FROM blog_categories");

blogInfo = thisFactory.executeStatement("SELECT * FROM blog_info");

blogInfo.first();

blogCategories.first();

while (!blogCategories.isAfterLast()) {

   

    blogEntries = thisFactory.executeStatement("SELECT * FROM blog_entry WHERE category = '" + blogCategories.getString("id") + "' ORDER BY id DESC");

blogEntries.first();

System.out.println("************ Doing category: " + CategoryBean.getCategory(blogCategories.getString("id")));

while (!blogEntries.isAfterLast()) { 

  this.addEntry(blogEntries.getString("title"),blogInfo.getString("url") + "/blog/BlogEntry.jsp?id=" + blogEntries.getString("id"), blogEntries.getString("date"), blogEntries.getString("teaser"), CategoryBean.getCategory(blogEntries.getString("category")), blogEntries.getString("author"));

  blogEntries.next();

}

final String XMLfile = ((fileName + blogCategories.getString("category")) + ".xml");

this.doSyndication(blogCategories.getString("title"), blogInfo.getString("url") + "/blog/BlogbyCategory.jsp?id=" + blogCategories.getString("id"), blogCategories.getString("description"), blogInfo.getString("copyright"), XMLfile);

this.entries.clear();

blogCategories.next();

}

}

catch (Exception ex) {

System.out.println("Category SQLException: " + ex.getMessage());

}

finally {

   

    try {blogEntries.close(); } catch (Exception ex) { System.out.println("SQLException: " + ex.getMessage()); }

    try {blogInfo.close(); } catch (Exception ex) { System.out.println("SQLException: " + ex.getMessage()); }

    try {blogCategories.close(); } catch (Exception ex) { System.out.println("SQLException: " + ex.getMessage()); }

    thisFactory.Close();

}

}

private void populatePodcastArray(String category_string) {

   

    final ConnectionFactory thisFactory = new ConnectionFactory();

ResultSet podEntries = null;

ResultSet blogInfo = null;

    try {

    podEntries = thisFactory.executeStatement("SELECT * FROM podcasts");

blogInfo = thisFactory.executeStatement("SELECT * FROM blog_info");

podEntries.first();

blogInfo.first();

while (!podEntries.isAfterLast()) {

   

  this.addPodCast(podEntries.getString("title"),blogInfo.getString("url") + "/blog/radio/" + podEntries.getString("filename"),podEntries.getString("date"), podEntries.getString("description"), category_string, podEntries.getString("author"));

  podEntries.next();

}

this.doSyndication(blogInfo.getString("name"), blogInfo.getString("url"), blogInfo.getString("description"), blogInfo.getString("copyright"),fileName);

System.out.println("Did Syndication");

}

catch (Exception ex) {

System.out.println("SQLException: " + ex.getMessage());

}

finally {

   

    try {podEntries.close(); } catch (Exception ex) { System.out.println("SQLException: " + ex.getMessage()); }

    try {blogInfo.close(); } catch (Exception ex) { System.out.println("SQLException: " + ex.getMessage()); }

    thisFactory.Close();

}

}

 

/**

* This method adds an entry to the ArrayList() which will be published when GenerateRSS()

* is called.

* <p>

* @param title The title of the blog entry (not the blog itself)

* @param link The PermaLink that will point to your entry

* @param date The date of the blog entry

* @param blogContent The content or synopsis you wish to publish

* @param cat The category of the entry. This has been added to integrate

*        with Technorati and match WordPress functionality

* @param author The author of the entry to be published.

*

*/

private void addEntry(String title, String link, String date, String blogContent, String cat, String author) {

try {

 

        entry = new SyndEntryImpl();

    entry.setAuthor(author);

        entry.setTitle(title);

        entry.setLink(link);

        entry.setPublishedDate(DATE_PARSER.parse(date));

        description = new SyndContentImpl();

        description.setType("text/plain");

        description.setValue(blogContent);

        entry.setDescription(description);

    category = new SyndCategoryImpl();

category.setName(cat);

categories.add(category);

entry.setCategories(categories);

categories.remove(category);

entries.add(entry);

}

        catch (Exception ex) {

            ex.printStackTrace();

            System.out.println("ERROR: "+ex.getMessage());

                             }

}

private void addPodCast(String title, String mp3link, String date, String blogContent, String cat, String author) {

try {

 

        entry = new SyndEntryImpl();

entry.setAuthor(author);

        entry.setTitle(title);

        entry.setLink(mp3link);

        entry.setPublishedDate(DATE_PARSER.parse(date));

        description = new SyndContentImpl();

        description.setType("text/plain");

        description.setValue(blogContent);

        entry.setDescription(description);

    category = new SyndCategoryImpl();

category.setName(cat);

categories.add(category);

entry.setCategories(categories);

categories.remove(category);

entries.add(entry);

}

        catch (Exception ex) {

            ex.printStackTrace();

            System.out.println("ERROR: "+ex.getMessage());

                             }

}

/**

* This method is called last after you have added all your entries and have specified your

* feed type and filename. This actually does the work

* <p>

* NOTE: This has static content entered in to the fields! You must have access to the source

* code edit this method or else you will be publishing content as the Post Modern Banter Blog

* Yes, I should change this immediately. Ideally, it would take values from the web.xml file itself.

* <p>

* @throws Exception

*/

private void doSyndication(String title, String link, String description_loc, String copyright, String xml) {

 

            try {

 

                final SyndFeed feed = new SyndFeedImpl();

                feed.setFeedType(feedType);

 

                feed.setTitle(title);

                feed.setLink(link);

                feed.setDescription(description_loc);

   feed.setCopyright(copyright);

                feed.setEntries(entries);

  

 

                final Writer writer = new FileWriter(xml);

                final SyndFeedOutput output = new SyndFeedOutput();

                output.output(feed,writer);

                writer.close();

 

                System.out.println("************* The feed has been written to the file ["+xml+"]");

 

            }

            catch (Exception ex) {

                ex.printStackTrace();

                System.out.println("ERROR: "+ex.getMessage());

                                 }

       

}

 

}

--------------------------------------------------------------------------------

作者的其他文章

Atlas 实现机制浅析 [3]

Atlas 实现机制浅析 [3]

live messenger与稀疏文件—Sparse File Bit

live messenger与稀疏文件—Sparse File Bit

又开学了!

自己制作的Rss阅读器(1)

代码整理

DNN中的Skinning系统

DNN中的Skinning系统

Windows Defender (Beta 2)

more..

其他相关文章

more... 搜索

本文关键字

技术: "JSP" "XML"

产品:

人物:

企业:"SUN"

热门关键字

技术

  数据库  XML  JSP  模式

  测试  Servlet

产品

  Tomcat  Struts

  WebLogic  Eclipse  Ant

企业

  SUN  Apache  IBM  Oracle

  microsoft

热点文章

JSF and AJAX

Java 5.0 多线程编程实践

Hibernate; Easy, Scalable Paging of Large Data

使用AJAX和J2EE创建功能强大的瘦客户端

开源数据库系统

J2EE中使用Spring AOP框架和EJB组件

Get Started with Multithreading in .NET

Exadel宣布AJAX在Studio Pro 3.5中支持JSF

IntelliJ IDEA: Detecting Probable NPEs

IntelliJ IDEA: i18n support

Java J2EE Lite with Spring Framework

比较完整全面的分页

甲骨文曾试图收购MySQL 继续其开源之路

Four Ways to Use Excel as an Internet Reporting Tool

关于权限模块的设想

最新文章

Exadel宣布AJAX在Studio Pro 3.5中支持JSF

Oracle收购BerkeleyDB

BEA宣布开放Kodo源代码—Java持久化API

甲骨文曾试图收购MySQL 继续其开源之路

利用J2EE部署CRM BEA和Siebel共推SOA

Java Web Application开发日志之二--“Ignore how they were created”,工厂方法模式应用

比较完整全面的分页

OSGi Alliance开设面向公众的邮件列表

关于权限模块的设想

oscache使用和研究

开源产品学习方法论

Rife的Continuations

eXtremeComponent在中文环境下的使用

webwork 2.2 中如何给Collection赋值

Get Started with Multithreading in .NET

一篇日记可以属于不同的目标

  例如,我有一篇日记“在eclipse中改变文件的binary/ascii属性”http://www.learndiary.com/disDiaryContentAction.do?searchDiaryID=1482&goalID=1482&naviStr=a10ag419a0419,里面是讲在eclipse里的cvs设置,涉及到“jsp图形开发环境的学习”http://www.learndiary.com/disGoalContentAction.do?goalID=419&naviStr=a10

和“学习cvs”http://www.learndiary.com/disGoalContentAction.do?goalID=398&naviStr=a10ac0ae0

两个学习目标。

  一篇日记按道理来讲是可以属于不同的目标的,怎么样恰当而系统的实现它,实现它有没有意义?这些需要进一步的思考。

目标内容的页面需要精心设计

  像www.43things.com,目标完成的人可以充当指导后来者的“老师”,这个页面可以展示哪些人加入了这个目标。可以展示征对这个目标的提问。征对这个目标投放了相应的google广告。所以,这个页面在43things.com的rss订阅中只给了链接也是有它的深意的。因为,网页上可以方便提供更丰富的信息,比如广告。

不要排斥广告

  恰当的广告是对社会的一种贡献。它可以沟通供求双方。像www.43things.com,征对某一个目标,投放对应的google广告,这样,给了实现这个目标的人一个辅助目标实现的选择。也使商家的服务得到认识,使他们实现自己的理想和追求。

  我今天就收了两封讲网络联合赚钱的群发邮件。从而联想到学习日记也可以做成这种联盟的形式,自助建站,等等。自助建站的域名可以是:***.learndiary.com的形式。

  所以,广告也有好处,不要因为过度广告的招人讨厌而全面否定它。

目标的分类和结构

分类:实践目标,学习目标

结构:实践目标和学习目标可以互为前提?

个人的目标树?目标之间的关系是单根树?还是可以是网状?

从数据结构和理论定律的高度进行目标的分类和结构的提炼。

学习日记rss订阅方案设计(希望得到您的意见或建议)

  看了www.43things.com的rss订阅方案和roller的rss方案,结合学习日记的特点,提出学习日记的rss订阅方案。

  1、个人的订阅:

  1)、我进行中的目标的最新39篇日记;(参数:type=diary.processGoal,userName=tom)

  2)、我写作的日记的最新39篇评论;(参数:type=advice.diary,userName=tom)

  2、全局的订阅:

  目标的订阅:

  1)、最近创建的39个目标;(参数:type=goal.last)

  2)、加入人数最多的39个目标;(参数:type=goal.mostJoin)

  日记的订阅:

  1)、最近写作的39篇日记;(参数:type=diary.last)

  评论的订阅:

  1)、最近提交的39篇评论;(参数:type=advice.last)

  3、征对某一个目标的订阅:

  1)、这个目标的最新39篇日记;(参数:type=diary.goal,goalID=1)

  2)、这个目标的最新39篇评论;(参数:type=advice.goal,goalID=1)

  订阅的格式:

  1、订阅的目标:

  目标题目

  ×××在什么时候创建了目标×××:

  目标内容(www.43things.com中目标的具体内容只有在网上看,它在这个页面有实现这个目标的相关的广告。学习日记可以考虑这种沟通用户的服务提供者的恰当的沟通方式)。

  2、订阅的日记:

  日记标题

  ×××在什么时候为×××目标写作了日记×××:

  日记内容

  3、订阅的评论:

  评论标题:

  ×××在什么时候评论了目标×××(或评论了目标×××下的日记×××):

  评论内容

  使用rss2.0规范,用rsslibj来生成(实际它可以生成0.92或1.0等规范的,但是没有atom的规范,这个公共库项目在2003年就停止了更新,估计是作者认为这个库已经完全满足它的主要目的了:专门用来生成rss文件),全局订阅单独放在一个页面中;某个目标的订阅分别放在所有目标页面的各个目标的条目中、目标的内容中、目标的日记列表中、目标的日记内容中。

  

今天在matrix的blog中试用blog客户端软件:w.bloggar不成功

  今天下载了一个blog离线写作工具-w.bloggar,按步骤设置后,提示: org.apache.xmlrpc.XmlRpcException: You have not enabled Blogger API support for your 可我明明已经在站点设置中设置了开启blogger API?搞不懂是怎么一回事了。

  rss客户端软件通过xmlrpc来与blog sever交流,blog sever提供一些约定的rpc方法供rss客户端调用。

  例如:在w.bloggar 的Faq中说:

What is w.bloggar?

The w.bloggar is an application that acts as an interface between the user and one or more blog(s); in other words, it is a Post and Template editor, with several features and resources that the browser based blog editors do not offer.

Because w.bloggar runs over the Windows GUI, it allows the user to edit posts without being connected to the Internet. Posts can be saved locally; and anytime the user wants to publish a new text, one click on the w.bloggar icon in the system tray brings up the editor, and one more click will post it to the weblog.

Another great advantage of w.bloggar is that it is compatible with most of the weblog systems available, allowing an advanced user to have only one interface to several accounts hosted on several different sites, using different publishing systems.

To communicate with the weblog, w.bloggar requires that the blog system have implemented an API (Application Programming Interface.) Currently, w.bloggar is compatible with all tools that implements Blogger API, metaWeblog API, MovableType API and b2 API; all based on the XML-RPC definition.