This project is read-only.

在你的程序中添加AcDown下载核心

本文将指导你如何:

  • 获取并编译最新版本的AcDown下载核心
  • 向基于.NET的项目中(使用C#或VB.NET)添加AcDown核心的引用
  • 了解AcDown核心管理器CoreManager与UI回调委托UIDelegateContainer
  • 初始化AcDown核心
  • 添加需要的插件
  • 添加下载任务
  • 获取任务的详细信息
  • 在任务完成或失败后进行处理

本文假设你已经掌握下列技术:

  • C# 3.0语言或VB.NET 9.0语言的基本语法
  • 使用Visual Studio 2010或更新的版本
  • 使用.NET语言、VS创建新的项目和添加对DLL文件的引用
  • 委托与泛型
  • Windows操作系统(Vista之后的版本)的基本知识
  • 对AcDown项目本身的初步了解

 

0 前言

AcDown是基于.NET Framework 2.0编写的开源下载器框架,通过插件体系支持众多站点的多媒体资源的解析和下载,与此同时提供了方便的API接口和框架,便于其他程序集成和调用。

 

1 获取并编译最新版本的AcDown下载核心

1.1 获取源代码

从这里浏览最新版本的AcDown源代码:

http://acdown.codeplex.com/SourceControl/BrowseLatest

从这里浏览所有历史版本的AcDown源代码:

http://acdown.codeplex.com/SourceControl/list/changesets

 

然后点击页面上的Download链接下载最新版本的源代码压缩包,如图:

image

 

1.2 编译AcDown核心

下载acdown-xxxxx.zip(xxxxx为变更集编号)文件后将其解压缩至一个单独的文件夹,进入AcDown子文件夹,然后双击AcDown.sln打开解决方案。

点击菜单中的【生成→配置管理器】

image

将【活动解决方案配置】设置为“Debug”,将【活动解决方案平台】设置为“Any CPU”后点击【关闭】

(注:如果需要编译发布版本,您可以将配置切换为“Release”,这样就不会生成相应的xml文件)

 

点击菜单中的【生成-重新生成解决方案】,等待编译完成。期间可以通过“输出”窗口查看编译进度

image

 

在【项目文件所在文件夹\AcDown\AcDown\bin\Debug】文件夹下找到已编译好的所有文件,其中需要使用的只有下面几个文件:

  • AcDownInterface.dll (必须,AcDown接口)
  • AcDownCore.dll(必须,AcDown核心与管理器)
  • AcDownDownloader.dll(AcDown项目自带的下载插件)
  • AcDownParser.dll(一些常用网站的解析器,AcDownDownloader.dll依赖于这个文件)

请视情况将这几个DLL文件单独拷贝出来备用。

还有一些与上面四个文件同名的xml文件,如AcDownInterface.xml、AcDownCore.dll等。这些xml文件是代码注释文档,建议您同样将其拷贝出来,这样在编写代码的时候就能够在VS的智能提示中看到详细介绍了

image

 

2 向基于.NET的项目中(使用C#或VB.NET)添加AcDown核心的引用

以C#控制台项目为例

  1. 使用Visual Studio创建一个新的C# Console Application项目
  2. 切换到“解决方案资源管理器”,右键点击项目名称,选择菜单中的“添加引用”
  3. 浏览刚才复制出来四个DLL文件,全部选中后点击“添加”

 

3 了解AcDown核心管理器CoreManager与UI回调委托UIDelegateContainer

3.1 AcDown核心管理器——CoreManager类

  • CoreManager类定义在命名空间Kaedei.AcDown.Core中,是AcDown的管理核心,负责管理AcDown框架的所有大小事务,如插件管理、任务管理、设置管理、日志、与UI部分通信等
  • CoreManager类是静态类,不需要手动进行实例化(但是需要使用代码初始化),AcDown核心在每一个AppDomain中只能存在一个。
  • CoreManager通过UI委托与用户界面进行通信与互相调用,用户界面不需要直接干预插件的行为。
  • AcDown使用的是 UI - Core - Plugin 的三层架构,其中Core是整个系统的核心,用来管理插件、任务以及下载器可能使用的各种资源、数据。UI(用户界面)负责处理用户输入,以及显示各类(来自于AcDown核心或插件的)需要显示的信息。Plugin部分提供给所有插件以统一的接口,并提供了一些常用的API以减少插件编写者的工作量。
  • 下面是一张老图(来自v3.x),其中的AcDown Components指的就是现在的CoreManager

AcDown动漫下载器技术细节(1)鈥斺敿芄

 

3.2 UI回调委托——UIDelegateContainer类与DelegateContainer类

  • 因为AcDown框架采用了UI与下载核心分离的架构,所有情况下下载操作都是异步进行的,所以需要设计一个通知机制来让AcDown核心在下载成功/失败后通知UI做出相应的改变
  • 依赖于.NET中的委托,DelegateContainer类(定义在Kaedei.AcDown.Interface命名空间中)包装了来自于AcDown核心的回调事件(不包括用户界面事件)
  • UIDelegateContainer类(定义在Kaedei.AcDown.Core命名空间中)继承自DelegateContainer类,包装了来自于UI的回调事件,包括下载开始/完成/失败/全部完成等事件。当这些事件发生时,AcDown核心会通知用户界面进行相应的处理

 

4 初始化AcDown核心

  • 在必要的时候(越早越好)调用CoreManager的Initialize()方法初始化AcDown核心。
  • 下面是Initialize()方法最常使用的重载之一:

public static void Initialize(string startupFolderPath, Kaedei.AcDown.Core.UIDelegateContainer uiDelegates)
    Kaedei.AcDown.Core.CoreManager 的成员

摘要:
初始化AcDown核心

参数:
startupFolderPath: 起始路径
uiDelegates: UI委托

  • 起始路径设置为任意文件夹,在AcDown核心初始化完成后,会向起始路径中写入config.xml文件(配置文件)和task.xml文件(任务列表)
  • UI委托请传入一个新的UIDelegateContainer类的实例,具体的用法会在后面的文章中进行详细介绍。
  • 示例代码:
CoreManager.Initialize(@"D:\TestAcDown\", 
new UIDelegateContainer(null, null, null, null, null, null, null, null));

 

5 添加需要的插件

5.1 添加内部插件

  • 内部插件指的是代码中编写好的,可以直接通过类名进行实例化的类
  • 加载这种内部插件的方法是调用CoreManager.PluginManager的LoadPlugin()方法
  • 示例代码:以加载Acfun、Bilibili和优酷插件为例,请首先using Kaedei.AcDown.Downloader
CoreManager.PluginManager.LoadPlugin(new AcFunPlugin());
CoreManager.PluginManager.LoadPlugin(new BilibiliPlugin());
CoreManager.PluginManager.LoadPlugin(new YoukuPlugin());

5.2 添加外部插件

  • 外部插件指的是.acp类型的插件文件,这类文件需要AcDown通过反射技术进行实时加载
  • 加载外部插件的方法是调用CoreManager.PluginManager的LoadPlugins()方法
  • LoadPlugins()方法会搜索刚才初始化CoreManager时指定的“起始路径”下的Plugins文件夹,加载其中所有符合要求的.acp文件
  • 添加外部插件并不是必须的步骤
  • 示例代码:
CoreManager.PluginManager.LoadPlugins()

 

6 添加下载任务

使用AddTask()添加下载任务

  • 使用CoreManager.TaskManager中的AddTask()方法添加新的下载任务,之后,还需要提供一些必要的详细信息。

public Kaedei.AcDown.Interface.TaskInfo AddTask(Kaedei.AcDown.Interface.IPlugin plugin, string url, System.Net.WebProxy proxySetting)
    Kaedei.AcDown.Core.TaskManager 的成员

摘要:
添加任务

参数:
plugin: 任务所属的插件引用
url: 任务Url
proxySetting: 代理服务器设置
downSub: 下载字幕文件设置

  • plugin参数:就是之前使用PluginManager.LoadPlugin()添加到AcDown核心中的插件的引用。
  • 如果你的程序需要从所有已加载的插件中进行搜索,CoreManager.PluginManager.Plugins对象集合保存了所有已加载插件的引用
  • url:任务网址
  • proxySetting:一个System.Net.WebProxy对象的引用,指示下载时使用的代理服务器,希望使用“使用IE设置(for Windows)/使用系统设置(for Linux)”的方式那么请传递null,如果希望使用“直接连接”的方式,请传递 new WebProxy()。 有关代理服务器更详细的信息可以参考这里: http://blog.sina.com.cn/s/blog_58c506600101a3p7.html
  • 下面是示例代码,使用了优酷下载插件来下载一个优酷视频:
var acf = new AcFunPlugin();
CoreManager.PluginManager.LoadPlugin(acf);
var task = CoreManager.TaskManager.AddTask(acf, "ac123456", null);

 

7 获取任务的详细信息

接上文

  • AddTask()方法返回一个TaskInfo对象(定义在Kaedei.AcDown.Interface命名空间中),TaskInfo类存储了此任务所有相关的信息,例如Url、插件、文件类型、创建时间、自动应答设置等等
  • 可以通过修改此TaskInfo对象的属性对任务进行进一步的修改
  • 例如,在某些插件支持的情况下,可以通过设置ExtractCache属性来允许插件提取系统和浏览器的缓存以加速下载。

 

8 开始任务

接上文

调用CoreManager.TaskManager的StartTask()方法使一个任务开始进行下载:

CoreManager.TaskManager.StartTask(task);

 

9 在任务完成或失败后进行处理

AcDown使用回调委托的方式处理下载运行前后和运行中发生的各类事件。回调事件必须满足委托AcTaskDelegate的签名

public delegate void AcTaskDelegate(Kaedei.AcDown.Interface.DelegateParameter para)

9.1 在某一任务完成后进行处理

在单个任务完成后,AcDown会调用Finish委托来通知用户界面进行改变。

void Finish(DelegateParameter e)
{
    //将e转换为包装参数的对象
    var task = (e as ParaFinish).SourceTask;
    //任务已经完成
    Console.WriteLine("DOWNLOAD FINISHED:" + task.TaskId.ToString());
}

9.2 在所有任务完成后进行处理

在所有任务完成后,AcDown会调用AllFinished委托通知用户界面。

void AllFinished(DelegateParameter e)
{
    Console.WriteLine("ALL DOWNLOAD FINISHED!");
}

9.3 修改Initialize()方法

还记得一开始初始化CoreManager时的代码吗?

CoreManager.Initialize(@"D:\TestAcDown\", new UIDelegateContainer(null, null, null, null, null, null, null, null));

将指定位置的null替换为方法名称,即可建立AcDown核心与UI的关联了,如:

CoreManager.Initialize(@"D:\TestAcDown\", 
new UIDelegateContainer(null, null, null, null, Finish, null, null, AllFinished));

10 示例代码

示例代码可以在这里找到:

http://vdisk.weibo.com/s/gOYNF

同时建议参考一下AcDown项目本身的实现

Last edited Oct 29, 2012 at 9:25 AM by kaedei, version 4

Comments

No comments yet.