# 2017.04.07 更新:由于未知原因,之前上传的 Workflow 动作都正确却无法正常运行。请重新下载修复的版本:全局视频下载器


前言

越来越多的视频下载Workflow?

少数派 Workflow Gallery 视频专栏

经过一段时间的等待,少数派终于在2017年3月29日率先推出了中文网上的 Workflow Gallery。其中视频专栏被置顶,Workflow 的下载数量也是最多,由此可见视频下载功能是 Workflow 应用的重中之重。

尽管 Workflow 中强大的动作能够让我们拼装出各种网站的视频下载器,但是当你的视频下载Workflow 数量多到一定程度的时候,未免就显得有些恼人了。比如当你要下载 Twitter 上的视频时,却发现点开 Run Workflow 菜单,你还需要从多个视频下载、以及其它杂七杂八的 Workflow 中挑出Twitter的下载器。这种不必要的麻烦对我、以及许多偏执狂来说是无法忍受的。而可以预见的是,Workflow Gallery 中视频这一专栏在未来还会多出一批Workflow。

我的众多Workflow中的一部分。我使用数种自制的视频下载器。

虽然听起来有点讽刺,但是我觉得一个以Workflow治Workflow的契机来临了。

我是第一个付诸实践的人吗?

当然不是,实际上很早以前已经有人想解决一下这个问题了,那个 Workflow 我记得是叫 Universal Downloader。故名思意,就是可以应用在各大视频网站的全局下载器。
它的方案是把所有的视频下载 Workflow 合而为一,并使用 If 语句引导。
不过看着里面密密麻麻、层层嵌套的 If 条件语句,我实在是一点好感都欠奉,因为这种解决问题的方式太过暴力,而且麻烦重重:
  1. 视频网站改版变动后不利于更新维护;
  2. 层层嵌套的 If 语句不易读,且难以删改;
  3. 。。。
仅第一点就足够在我这把这个方案枪毙一百遍了!所以那时我宁可进行人肉 If 判断。
虽然类似的情形在各种编程语言里实在是小case,但在 Workflow 这种图形化编程的、有许多独特限制的 App 里,我觉得简洁、易维护、易读比什么都重要,传统编程语言中的一些常规方案不能生搬硬套到 Workflow 里。

以 Workflow 治 Workflow 的希望?

终于,在 Workflow 的 1.7.1 版本里,我们可以在一个Workflow里运行另一个Workflow了!这就使得一种一劳永逸解决这个问题的方案出现了。
也许你会认为我会把 Universal Downloader 中 If 语句下的程序用更新的 Run Workflow 动作进行替换?不,那依然没有从根本上解决问题。
这并不是好的解决方案。

一个更简洁的 Universal Downloader

先来一些概念性的铺垫

字典 Dictionary

被很多人忽视的 Dictionary 动作
尽管 Dictionary 这个动作在许多 Workflow 用户眼里没有什么存在感,但是稍微接触过编程的人都清楚这种数据结构的重要性和实用性。往小了来说,许多少数派读者分享的利用 API 的 Workflow 处处可见 Get Dictionary Value 动作的身影,只不过很少有人会特意使用 Dictionary 动作来自己创建一个 Dictionary 罢了。
而在我的解决方案中,这是必不可少的一个动作,夸张点可以说是发挥了中流砥柱的效用。

隐藏 Workflow

对于一个 "Action Extension" Workflow——即会出现在 Run Workflow 菜单中供你调用的 Workflow,如果在保留了 Workflow Input 这个魔法变量后,将其重新设置为 "Normal" Workflow,那么它会从 Run Workflow 菜单中消失,但是依然能通过 URL Scheme 或者 Run Workflow 动作来调用它处理数据。

隐藏 Workflow 的范例。左侧的 "Action Extension" Workflow 通过右侧的 Get Variable 动作保留下 Workflow Input 魔法变量后,可以设为 "Normal" Workflow 来隐藏,但不影响调用。

显而易见,这一特性能够帮助我们清理 Run Workflow 菜单中许多不必要的视频下载Workflow,同时保留它们的功能。

全局视频下载器

该全局视频下载器兼容目前 Workflow Gallery 的所有视频下载Workflow,它们都可以使用本 Workflow 调用。
下面是步骤说明:

开头的 Dictionary 在这里充当一个规则列表的作用。在该字典中,键 (key) 为用于匹配视频网站链接的关键词,键值 (key value) 为处理该视频网站链接的 Workflow 名称。这种方案的优势在于可以通过只修改 Dictionary 来迅速增加、删除相关Workflow的引导,以及直观表现各匹配关键词和相关Workflow之间的一对一关系。

在安装完这个 Workflow 后,不要忘记对那几个视频下载 Workflow 做隐藏处理:在开头插入 Workflow Input 变量,再将其设为 ”Normal" Workflow。

如此,通过寥寥的几个动作,就可以方便地管理所有的、以及未来可能添加的视频下载 Workflow 了。Run Workflow 菜单中也只会出现这一个全局 Workflow ,变得更整洁。未来如果新添加了别的视频 Workflow,都可以通过这个 Dictionary 快速添加。

深化拓展

 全局视频下载器 这个 Workflow 是我在另一个复杂点的 Workflow 上精简而成的。

之所以复杂,是因为我把下载视频这一流程拆成了三大部分,并在这三部分上各自进一步深化:

1. Workflow 引导

指的是对导入的链接进行判断,并将其送入相应的 Workflow 获取视频直链,也就是 全局视频下载器 所做的工作。唯一的小改动是,我使其也可以从通知中心启动,解析剪贴板中的链接。具体的方案请参考 JailbreakHum 的 Workflow 思路教程,或者使用我的方案:
一种可以同时兼容 Action Extension 和 Today Widget 的方案

2. 视频直链获取

指的是各种视频下载 Workflow 所做的工作,或使用 API 获取,或直接从网页源码中抓取视频的直链。

和 Workflow Gallery 中那些 Workflow 的不同的是,我删除了这些 Workflow 中最后的 Get Content from URL 动作,转而使用 Dictionary 动作代替:

每个视频直链获取 Worklfow 统一将数据输出为 Dictionary 格式。

由此这些 Workflow 最后都生成一个 Dictionary,其中包含该视频的直链和名称信息。

3. 视频直链处理

第二部分生成的 Dictionary 将统一交给这个单独的 Workflow 处理。可以选择下载视频到本地,也可以选择使用各类服务器远程下载。
一个典型的视频下载流程。可以看见除了一个Video Downloader 外,Run Workflow 菜单中没有其它无关的视频Workflow了。
这里重点说一下 Dropbox 的远程下载。除非是微博、Tumblr、Twitter上这类短视频,像 YouTube 上那些较大的视频,除非有必要马上观看,不然都应该尽量使用服务器去离线下载,以免占用过多时间。比如一个10分钟的《视察二院》,手机上可能需要花1分钟才能下完,Dropbox 基本是秒下,之后等它同步到你的电脑里即可。
Workflow本身并不支持 Dropbox 的离线下载,你需要自行拼装一个出来,具体请参考官方 API 文档里的 Save URL 部分。
Dropbox API 中的 Save URL 在 Workflow 中的应用

结语

除此以外,Dictionary 能在 Workflow 中发挥的独特作用还有很多。以后有机会再详细介绍。