WPF Podcatcher 系列 - 第 1 部分 (Introducing Podder)






4.78/5 (24投票s)
这是致力于一个 WPF 应用程序的系列文章的第一篇,该应用程序可以播放来自互联网的流式播客。

引言
欢迎阅读我编写的 WPF 应用程序 Podder 系列文章的第一篇。Podder 允许您收听通过网络流式传输的播客。本文的目标是介绍 Podder,让全世界的人们开始享用它。然而,整个系列的目的是回顾 Podder 设计和实现的有趣方面。
在撰写本文时,该应用程序尚未完成。我仍计划为 Podder 添加许多大小不一的功能。不过,目前它已经足够成熟,可以开始这个系列了,所以我认为越早越好。本文顶部的文件下载链接可能会在系列新文章发布时有所更改。Podder 是一个活跃的项目。
背景
播客就像一个广播节目;它是由同一个人或一群人围绕某个特定主题录制的一系列剧集。它可以包含任何音频内容,因为它只是一个普通的音频文件,例如 MP3。一集可以包含访谈、独白、音乐、鼓掌声等等。几乎所有的播客都有一个相关的 RSS Feed,这样您就可以轻松找到播客中的所有剧集,并发现新发布的剧集。
播客播放器是一个允许您播放播客剧集的程序。大多数播客播放器允许您订阅各种播客 RSS Feed,并在新剧集可用时自动通知您。Podder 允许您维护一个播客 RSS Feed 列表,但尚未提供新剧集存在的通知。
Podder 应用程序是在我构建了两个简单的播客播放器原型后创建的;第一个是 Silverlight,另一个是 WPF。Podder 比这两个原型要复杂得多,功能也更丰富,但它们是让我能够正确设计 Podder 的宝贵学习经验。
使用的技术
- VS2008 & .NET 3.5
- WPF
- XLinq
- C# 3.0
Podder 功能
该应用程序拥有播客播放器应有的核心功能,以及一些我喜欢的额外功能。以下是您将在 Podder 中找到的功能:
- 存储播客 RSS Feed 列表并查看所有可用剧集
- 流式传输剧集以立即播放
- 标准的播放、暂停和停止功能
- 在播客中进行搜索,如快进和快退
- 标记您喜欢的剧集,并在“我的收藏”列表中查看它们。该列表在应用程序运行时会保留。
- 记住您已经听过的剧集,因为它们在播放完成后会被标记为“已完成”。已完成剧集列表在应用程序运行时会保留。
- 可选地以无尽循环方式播放播客中的每个剧集
- 刷新播客剧集列表,这对于经常更新的播客 Feed 非常有用
- 在外部程序中打开剧集(根据播客是网页浏览器或 MP3 播放器)
ListView
中剧集项的工具提示显示额外信息,如发布日期和文件大小- 窗口大小、状态和位置在应用程序运行时会保留
- 各种用户界面设置在应用程序运行时会保留
- 预加载了一些播客,以便新用户可以立即开始收听剧集
- Podder 最终将允许您在运行时应用完全不同的用户界面(即“结构化皮肤”)。
图片库
以下是 Podder 的一些屏幕截图,使用的是默认皮肤(目前是唯一皮肤)。第一张图显示了收藏剧集列表以及剧集上的工具提示,其中显示了有关该剧集的额外信息。
下一张图显示了我输入到 Podder 中的播客列表。请注意,下拉列表中的第一项允许您查看收藏剧集列表。

下面的截图显示了右键单击 ListView
中的某一项时出现的上下文菜单。菜单项允许您根据播客 RSS Feed 的 <link>
元素中提供的 URL,在网页浏览器或 MP3 播放器中打开剧集。如果它是一个网页 URL,则会在您的默认浏览器中打开该页面。如果它直接指向音频文件,则会在您的默认音频播放器(如 Windows Media Player)中打开。

最后一张图显示了用于将播客添加到应用程序的播客 RSS Feed 列表中的对话框。在撰写本文时,此对话框不提供任何验证,但将在后续版本中提供。

关注点
Podder 中有许多有趣的内容值得探索。本节列出了一些,下一篇文章将详细探讨其中一些内容。
结构化皮肤
Podder 支持我称之为“结构化皮肤”的功能。结构化皮肤允许您在运行时为应用程序应用全新的用户界面。您可以替换 UI 中的所有控件,以及颜色方案、字体等。它使用模型-视图-控制器(MVC)模式、路由命令、集合视图和动态资源引用来实现这一点。本系列的后续文章将深入探讨此主题。在撰写本文时,Podder 还没有任何其他皮肤,但很快就会有。
EpisodePlayer
该应用程序使用 WPF 的 MediaPlayer
类来播放剧集 MP3 文件。我继承了 MediaPlayer
类,创建了 EpisodePlayer
,它封装了 MediaPlayer
的操作,并弥补了其一些怪癖。我花费了不成比例的大量开发精力来解决 MediaPlayer
的奇怪行为。我已经尽我所能解决了所有问题。
使用 XLinq 读取 RSS Feed
播客的 RSS Feed 就像任何 RSS Feed 一样,它只是一个 XML 文档。由于 Podder 是基于 .NET 3.5 Framework 编写的,我使用 XLinq 将 RSS Feed 转换为我的 Episode
类的实例。使用 XLinq 使 XML 处理变得容易得多。
可序列化数据模型
Podder 不使用数据库或 XML 文件来保存其数据。当窗口关闭时,它使用 BinaryFormatter
序列化数据模型,并将该二进制流保存到磁盘。当应用程序再次打开时,它会反序列化该文件中的数据,然后应用程序使用这些对象。
应用程序的域类位于PodderLib项目中。其中大多数类都继承自我的 BindableObject 基类,该类提供了 INotifyPropertyChanged
的实现等。
持久化的窗口设置
主窗口和“管理播客”对话框都在应用程序运行时会记住它们的大小、状态和位置。它们都继承自我的 ConfigurableWindow 基类,从而免费获得该功能。该类是专门为 Podder 构建的,但可以在任何 WPF 程序中使用。
还有更多…
很难列出应用程序代码库中“有趣”的方面,因为每个人都有不同的看法。如果您有兴趣了解 Podder 还有什么其他功能,我建议您下载源代码并自行探索。如果您有任何问题,请随时在本文的消息板上提问或发表评论。
尚未实现
- 动态发现和应用外部皮肤的能力
- 对活动的互联网连接或缺乏连接的感知
- 改进的播客管理对话框
- 用户友好的错误处理
- 美观的用户界面
- 通知您 Feed 中何时存在新剧集
- 还有很多很多!
特别感谢
Polymorphic Podcast 的主持人 Craig Shoemaker 提供了许多有用的反馈、富有洞察力的建议和鼓励。
Karl Shifflett 在测试和提交 Bug 报告方面提供了很多帮助。他还提出了一些有品位的特色请求。
Sacha Barber 间接提供了帮助,因为他关于 XLinq 的文章帮助我掌握了 XLinq,以便我能够使用它来解析 RSS Feed。
修订历史
- 2008 年 1 月 6 日 - 创建文章